Цель работы: познакомиться с понятием "рекурсия" и особенностями рекурсивных процедур и функций языка программирования Pascal, закрепить практические навыки работы с системой TURBO Pascal на примере реализации алгоритмов при помощи рекурсивных процедур и функций.
Рекурсия (самоповторение) - действие, возвращающееся к "самому себе". Имеется два вида рекурсии: (1) прямая рекурсия означает, что процедура вызывает саму себя; (2) косвенная рекурсия означает, что одна процедура вызывает другую процедуру, а это в свою очередь прямо или косвенно приводит к вызову первоначальной процедуры.
Рекурсию следует использовать только тогда, когда задача легко поддается рекурсивному решению. Любая задача, которая может быть решена рекурсивно, также может быть решена и без рекурсии.
С понятием рекурсии тесно связано понятие "рекуррентная последовательность", вычисление n-го члена которой производится с помощью рекурсии. Определим это понятие: числовая последовательность {} называется рекуррентной , если В частности, при p=1 , при р=2:
Пример Рекурсивное и нерекурсивное вычисление факториала натурального числа n.
PROGRAM Fact (Input,Output); {$N+ $E+} { Рекурсивное вычисление факториала }
var n: Integer;
{ ------------------------------------------------------------------------ }
FUNCTION RecursiveFact (n: Integer): Integer;
BEGIN { Рекурсивное вычисление факториала }
If n=0
then RecursiveFact:=1
else RecursiveFact:=n*RecursiveFact(n-1)
END;
{ ------------------------------------------------ }
FUNCTION NonRecursiveFact (n: Integer): Integer;
var P: Integer;
BEGIN { Вычисление факториала с использованием вместо рекурсии повторения }
P:=1;
While n>1 do begin P:=n*P; n:=n-1 end;
NonRecursiveFact:=P
END;
{ ---- }
BEGIN
Write ('Введите натуральное число: '); ReadLn (n);
Write ('Результат, вычисленный рекурсивно: '); WriteLn (RecursiveFact(n));
Write ('Результат, вычисленный нерекурсивно: ');
WriteLn (NonRecursiveFact(n))
END.
Пример 2
Рекурсивный и нерекурсивный поиск наибольшего общего делителя двух чисел.
PROGRAM NOD (Input,Output);
var X,Y: Integer;
{ ------------------------------------------------ }
FUNCTION RecursiveNOD (n,m: Integer): Integer;
BEGIN { Рекурсивное вычисление НОД чисел n и m }
If n=m
then RecursiveNOD:=n
else If n>m
then RecursiveNOD:=RecursiveNOD (n-m,m)
else RecursiveNOD:=RecursiveNOD (n,m-n)
END;
{ ------------------------------------------------ }
FUNCTION NonRecursiveNOD (n,m: Integer): Integer;
BEGIN { Алгоритм, использующий вместо рекурсии повторение }
While n<>m do
If n>m
then n:=n-m
else m:=m-n;
NonRecursiveNOD:=n
END;
{ ---- }
BEGIN
Write ('Введите два целых числа, отличных от 0: '); Read (X); ReadLn (Y);
Write ('Результат, полученный рекурсивно: ');
WriteLn (RecursiveNOD(Abs(X),Abs(Y)));
Write ('Результат, полученный нерекурсивно: ');
WriteLn (NonRecursiveNOD(Abs(X),Abs(Y)))
END.
ЗАДАЧИ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
1.
Написать программу вычисления P по формуле: где n - заданное натуральное число.
2.
Написать программу вычисления , где
3.
Дано натуральное число n. Найти (2n)! и 2n!. Использовать рекурсивную функцию вычисления факториала.
4.
Даны натуральные числа n,m. Найти НОД(n,m). Использовать рекурсивную функцию вычисления НОД, основанную на соотношении НОД (n,m)=НОД (m,r), где r - остаток от деления n на m.
5.
Числа Фибоначчи определяются следующим образом: Проверить на нескольких примерах, будет ли делиться на 5.
6.
Даны неотрицательные целые
числа n и m. Вычислить функцию Аккермана:
Приведем некоторые тестовые примеры:
7.
Описать рекурсивную функцию Stepen(x,n) от вещественного x и натурального n, вычисляющую (через умножение) величину , и использовать ee для вычисления Величину вычислять по формуле:
8.
Описать рекурсивную функцию C(m,n) для вычисления биноминального коэффициента по формуле:
9.
Описать рекурсивную функцию,
позволяющую вычислить
Какие возможные значения принимает эта функция?
10.
Описать рекурсивную функцию, позволяющую вычислить
11.
Описать рекурсивную функцию Strannost, определенную на множестве положительных целых чисел следующим образом:
12.
Написать рекурсивную процедуру, при выполнении которой на экран будет выводиться отрезок натурального ряда чисел.
13.
Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр. Использовать рекурсивную функцию вычисления n!.
14.
Числа Фибоначчи определяются следующим образом:
Написать программу вычисления первого числа Фибоначчи, большего m (m>1),
включающую рекурсивную функцию, которая основана на непосредственном
использовании соотношения
15.
Определить число, получаемое выписыванием в обратном порядке цифр заданного натурального числа (использовать рекурсивную функцию).
16.
Числа Фибоначчи второго порядка определяются следующим образом:
Написать программу вычисления для
данного неотрицательного целого n.
17.
Установить назначение следующей функции:
FUNCTION SumOfDigits (n: Integer): Integer;
BEGIN
If n=0
then SumOfDigits:=0
else SumOfDigits:=(n MOD 10)+SumOfDigits (n DIV 10)
END;
18.
Установить назначение следующей функции:
FUNCTION HiDigit (n: Integer): Integer;
BEGIN
If n<10
then HiDigit:=n
else HiDigit:=HiDigit (n DIV 10)
END;
19.
Пусть Вычислить для заданного натурального n.
20.
Среди первых n+1 элементов
последовательности
найти количество тех элементов, которые принадлежат интервалу (с,d).
Предполагается, что .
21.
Задана рекуррентная
последовательность
Вычислить . Считать .
22.
Числа Фибоначчи определяются
следующим образом:
Найти номер первого числа Фибоначчи, которое больше h.
23.
Пусть Вычислить для заданного натурального k.
24.
Найти (в выражении присутствуют ровно n радикалов):
25.
Вычислить, используя рекурсию (результат принадлежит Сринивазу Рамануджану). Ответ: 3
26.
Вычислить, используя рекурсию
(результат принадлежит Сринивазу Рамануджану) где знаки перед корнями периодически
повторяются группами по три: "-","+","-".Вывести уравнение, корнем которого
является X.
Ответ:
27.
Вычислить, используя рекурсию
(результат принадлежит Сринивазу Рамануджану) где знаки перед корнями периодически
повторяются группами по три: "-","+","-". Вывести уравнение, корнем которого
является X.
Ответ:
28.
Вычислить, используя рекурсию
(результат принадлежит Сринивазу Рамануджану) где знаки перед корнями периодически
повторяются группами по три: "-","+","+".Вывести уравнение, корнем которого
является X.
Ответ:
29.
Вычислить, используя рекурсию
(результат принадлежит Сринивазу Рамануджану):
Ответ:4
30.
Вычислить, используя рекурсию
(результат принадлежит Сринивазу Рамануджану):
(Ответ:)n+2