2017-01-20 6 views
-2

У меня есть этот код возвращает строку в нижнем регистре, используя рекурсию:Чтобы прописные рекурсивный алгоритм

function min(ch:string):string; 
begin 
    if (ch = '') then 
     min:= '' 
    else 
     if (ch[1] in ['A'..'Z']) then 
     begin 
      ch[1]:=chr(ord(ch[1])+32); 
      min:= ch[1] + min(copy(ch,2,length(ch)-1)); 
     end; 
end; 

Но это не работает:

Когда я запускаю его на примере min('AbC') выход a только нет abc.

Где находится проблема?

+0

Как это не работает? Что происходит, когда вы запускаете его? –

+1

* Это не работает * не является осмысленным описанием проблемы. Как именно это * не работает *? Вы получаете ошибки компилятора? Если да, то что они ** точно **? Скомпилирует ли он, но производит результат, отличный от ожидаемого? Если да, то какой вклад вы предоставляли и выводили, ожидали ли вы, и что вы получили вместо этого? –

+0

И, что ** точно ** вы ожидаете от этого? – MartynA

ответ

1

Проблема в том, что вы не всегда вызываете рекурсивную функцию. Как только вы найдете письмо, которое уже является нижним регистром, вы больше не смотрите на персонажей, которые следуют за ним. И поэтому возвращаемое значение усекается до этого символа.

Вы также должны назвать это, когда персонаж, на который смотрит, равен не заглавная буква. Так переместить рекурсивный вызов из этого if, и он будет работать:

function min(ch:string):string; 
begin 
    if (ch = '') then 
     min:= '' 
    else 
     begin 
     if (ch[1] in ['A'..'Z']) then 
      ch[1]:=chr(ord(ch[1])+32); 
     min:= ch[1] + min(copy(ch,2,length(ch)-1)); 
     end; 
end; 

Посмотреть работать на ideone.com.