Рекурсивные функции

Если в теле функции встречается вызов самой этой функции, то мы имеем дело с так называемой рекурсией. В языке программирования Pascal рекурсивностью могут обладать как функции, так и процедуры.

procedure rever (n: integer);
    begin
        write (n mod 10);
        if (n div 10) <> 0 then
            rever (n div 10)
    end;
 
begin
    rever (3096);
 
readln
end.

В приведенном примере процедура rever выводит цифры, переданного ей в качестве фактического параметра числа, в обратном порядке. Т.е. если мы передаем число 35, то процедура выведет на экран число 53. Рассмотрим, как она это делает:

  1. Мы передаем число 3096.
  2. Процедура rever выводит на экран остаток от деления на 10. Это число 6.
  3. Переход на новую строку не происходит, т.к. используется write.
  4. Проверяется условие того, что 3096 при деление нацело на 10 больше нуля.
  5. Вызывается rever с фактическим параметром, равным 309.
  6. Вторая запущенная процедура выводит на экран цифру 9 и запускает третью процедуру с параметром 30.
  7. Третья процедура выводит 0 и вызывает четвертый rever с 3 в качестве параметра.
  8. Четвертая процедура выводит 3 на экран и ничего больше не вызывает, т.к. условие (3 div 10) <> 0 ложно.
  9. Четвертая процедура завершается и передает управление третьей.
  10. Третья процедура завершается и передает управление второй.
  11. Вторая процедура завершается и передает управление первой.
  12. Первая процедура завершается и передает управление в основную ветку программы.

В итоге, процедура rever была вызвана четыре раза, хотя из основной программы к ней было единственное обращение.

Наличие условия в теле рекурсивной функции (или процедуры), при котором она больше себя не будет вызывать, очень важно. В противном случае, как и в ситуации с циклами, может произойти так называемое зацикливание.

Задачи к данной теме

Комментарии

Помогите пожалуйсто

Задание1. Вычислить факториал числа, используя рекурсивную функцию и не ре-курсивную процедуру. Сравнить их по скорости выполнения для больших N.
Задание 2. Разработать программу для реализации рекурсивных функций сложения, вычитания, деления и вычисления остатка от деления двух целых чисел.
Задание 3. Разработать функции рекурсивной и не рекурсивной реализации алго-ритма Евклида нахождения наибольшего общего делителя (НОД) двух натуральных чи-сел. Сравнить функции по скорости выполнения для больших чисел. В программе реали-зовать также вычисление НОК (наименьшее общее кратное).
Задание 4. Разработать функции рекурсивного и не рекурсивного вывода чисел Фибоначчи. Сравнить функции по скорости выполнения для больших N.
Задание 5. Разработать рекурсивную процедуру перевода целого числа из десятич-ной системы счисления в двоичную систему.

Помогите Решить, пожалуйста.Очень нужно!

http://s51.radikal.ru/i131/1411/4f/dd810f94cb1c.jpg

помогите решить пожалуйста!!!!

В квадрате 6 на 6 стоят цифры от 1 до 6 и звездочки *. Заменить все звездочки на одну из цифр 1-6 так, чтобы в каждой строке и в каждом столбце все цифры были разные.

пример входа:
1 * * 2 * 3
* * 4 * * 5
5 * * 3 * 2
* * 2 * * *
1 * * 5 * *
* * 3 * * 1

ребят все работает, но вот

ребят все работает, но вот как меняется у нас n! Вызывается rever с фактическим параметром, равным 309 - это понятно, а вот как "запускает третью процедуру с параметром 30" n не менялась же, не было присваивания параметра n:=309; Чего я не понимаю?))

n div 10=n=30 в следующий

n div 10=n=30
в следующий стадии n равно значению n div 10 в которой n взят из предыдущего этапа то есть если раньше n=309 то дальше n=n div 10=30;