- •2008 № I информатика
- •2008 № 4 Информатика
- •2. Статья "Частотный анализ"
- •1. Общие вопросы
- •2. Особенности выполнения рекурсивных алгоритмов
- •3. Рекурсивные функции и процедуры для обсуждения
- •2008 Nt 5 информатика
- •4. Задания на использование рекурсии
- •2008 № 5 Информатика
- •2008 N» 5 информатика
- •2008 N» 5 информатика
- •2008 № 5 Информатика
- •5. Прямая и косвенная рекурсия
- •5. Формы рекурсивных процедур6
- •2008 № 5 Информатика
2008 N» 5 информатика
21
Решение
I]ро1|сдура, обеспечивающая рс-шемш' задачи:
Procedure Printfn: longint);
Begin
If л < 10 Then
Begin л :-T n; write(a)
End
Else
Begin
(РеКурСИВНЫЙ ВЫЗОВ Пропекут i W..,.|
Print(n div 10); (Определение и вывел последней цифры числа ri) л :- n mod 10; write(a) End End;
Здесь также имеет место так называемая "Форма рекурсивной процедуры с выполнением действий после рекурсивного вызова (или с выполнением действий на рекурсивном возврате)" — см. раздел 5. — Прим. ред.
15. Разработать программу, которая вычисляет длину заданной строки (стандартную функцию Length не использовать).
Решение
В рекурсивной функции применяется стандартная процедура Delete:
Function Lents: string): byte; Begin
If S = " Then Len := 0
Else
Begin
Deietels, 1, 1); Len := 1 + Len(s) End End;
16. Разработать программу, проверяющую, является ли некоторая строка палиндромом (т.е. читается одинаково слева направо и справа налево).
Решение
Рекурсивная функция, возвращающая результат логического типа, с помощью которой можно решить задачу, имеет вид:
Function PaKs: string): boolean; Begin
{Если строка 'пустая' или состоит из одного символа} If (s » ") Or (Length(s) - 1) Than Pal :=■ true Else
(Сравниваем первый и последний символы строки)
If s[l] о s(Length(s)] Then Pal : = false Else
{Удаляем первый и последний символы строки) Begin
Deiete(n, I, l); Deletets, LengtM.'j), 1); |и вновь проверяли ост.и.щу«х:я строку! Pal :- Pal(a) End End;
'-Эта функция ииюлмуетия к основной части про-qxiMMbl при выводе ответа:
If l'rtl(ot)
Then writelnCCxpoKa является палиндромом'( Elee wtitelnCCrpoKa не является палиндромом');
— где it — проверяемая строка.
Можно также процедуру Delete не применять, а при рекуртивмом вы:юве исполь:ювать функцию Сору.
17.1'а^работать программу расчета суммы двух натуральных чисел, используя только прибавление единицы.
Решение
Рекурсивная функция Summal, возвращаклцая число a как результат сложения а единиц, может быть оформлена и виде:
Function r;ummal(a: byte): word;
Begin
If ;j i Than Summal :- 1
Else Summal :■ 1 + Summal (a — 1)
End;
1)та функция используется в основной части программы для подсчета искомого результата rez: rez := SummaKnl) + Summal(n2);
— где п\ и «2 — складываемые числа.
18. Разработать программу расчета произведения двух натуральных чисел, используя только операцию сложения.
Решение
Рекурсивная функция, возвращающая произведение двух своих параметров а1и<?2как результат многократного сложения, имеет вид:
Function Multlal, a2 : byte): longint;
Begin
If a2 - 1 Then Mult :» al
Else Mult :=• al + Multlal, a2 - 1)
End;
Возможен также "симметричный" вариант, в котором происходит al сложений числа д2, а также "общий вариант, в котором после сравнения al и al выбирается оптимальный с точки зрения количества операций сложения.
19. Разработать программу для вывода заданной последовательности чисел, оканчивающейся нулем, в обратном порядке.
Решение
В соответствующей рекурсивной процедуре используется локальная переменная п — очередное число последовательности:
Procedure Output;
Var n: integer;
22