Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл: Источник:
Скачиваний:
111
Добавлен:
04.03.2014
Размер:
185.34 Кб
Скачать

Var s:string;

function f_char(st:string):boolean;forward;

function f_value(st:string):boolean;

begin if length(st)=0 then f_value:=true

else if (st[1]<='9') and (st[1]>='0') then f_value:=f_char(copy(st,2,length(st)-1))

else f_value:=false;

end;

function f_char;

begin if length(st)=0 then f_char:=true

else if (st[1]<='Z') and (st[1]>='A') then f_char:=f_value(copy(st,2,length(st)-1))

else f_char:=false;

end;

begin writeln('Введите строку'); readln(s);

If f_char(s) then writeln(' Строка корректна')

else writeln('Строка не корректна');

end.

Данная программа построена не удачно, так как размер фрейма активации V»260 байт. Для уменьшения размера фрейма следует подумать об изменении способа передачи параметра. Действительно, если гарантировать, что исходная строка изменяться не будет, то ее можно передавать по ссылке. Переход к следующему символу можно осуществить, добавив еще один параметр - индекс, передаваемый по значению. Размер фрейма активации при этом сократится (V»10). Кроме этого, в программе использована более удобная проверка (с использованием множеств).

program ex2;

Var s:string;

function f_char(var st:string;i:word):boolean;forward;

function f_value(var st:string;i:word):boolean;

begin if i>length(st) then f_value:=true

else if (st[i] in ['0'..'9'])then f_value:=f_char(st,i+1)

else f_value:=false;

end;

function f_char;

begin if i>length(st) then f_char:=true

else if (st[i] in ['A'..'Z','a'..'z']) then f_char:=f_value(st,i+1)

else f_char:=false;

end;

begin writeln('Введите строку');

readln(s);

If f_char(s,1) then writeln('Строка корректна')

else writeln(' Строка не корректна');

end.

Таким образом, по возможности, в рекурсивных подпрограммах при передаче строк и массивов следует использовать передачу по ссылке, что приводит к уменьшению размера фрейма активации.

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

Нерекурсивная программа для решения данной задачи должна содержать, по крайней мере, два цикла не считая цикла ввода. Рекурсивный вариант может использовать так называемый "рекурсивный возврат" для вывода оставшихся элементов.

Структура рекурсивной подпрограммы имеет в общем случае вид, представленный на рисунке 6. Операторы, которые на схеме помечены как "операторы после вызова" будут выполняться после возврата управления из рекурсивно вызванной подпрограммы. Если попытаться изобразить последовательность действий, то она будет выглядеть так, как показано на рисунке 7.

Рис 6

Рис. 7.

Таким образом, сначала выполняются операторы до вызова всех активаций, затем, при достижении условия выхода, нерекурсивная часть, а затем, в порядке, обратном порядку вызова, операторы, записанные после рекурсивного вызова (!!!). Используя это свойство, построим решение следующим образом: в области до вызова запрограммируем печать положительных чисел, в области после вызова - печать отрицательных чисел, а нерекурсивная часть будет содержать вывод звездочек.

program ex;

type mas=array[1..10] of real;

var x:mas;

Соседние файлы в папке Методичка С++