Рекурсия (PascalABC.NET): различия между версиями

Материал из Информационная безопасностя
Перейти к навигации Перейти к поиску
 
(не показаны 3 промежуточные версии этого же участника)
Строка 1: Строка 1:
 
{{TOCRight}}
 
{{TOCRight}}
  
Вспомните, что факториал натурального числа n вычисляется как произведение всех натуральных чисел от 1 до n включительно. Факториал единицы равен единице и записывается это так: 1! = 1. Мы можем найти факториал, используя рекуррентную формулу
+
Вспомните, что факториал натурального числа n вычисляется как произведение всех натуральных чисел от 1 до n включительно.
 +
 
 +
Факториал единицы равен единице и записывается это так: 1! = 1.
 +
 
 +
Мы можем найти факториал, используя рекуррентную формулу
 +
 
 
[[Файл:Fact.png|300px]]
 
[[Файл:Fact.png|300px]]
  
Строка 26: Строка 31:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Для нужд, в частности, комбинаторики факториал дополняется возможностью принимать аргумент, равный нулю. Принято считать по определению, что 0! = 1.
+
Для нужд, в частности, комбинаторики факториал дополняется возможностью принимать аргумент, равный нулю.
 +
 
 +
Принято считать по определению, что 0! = 1.
  
 
<syntaxhighlight lang="pascal" line>
 
<syntaxhighlight lang="pascal" line>

Текущая версия на 20:07, 21 мая 2023

Вспомните, что факториал натурального числа n вычисляется как произведение всех натуральных чисел от 1 до n включительно.

Факториал единицы равен единице и записывается это так: 1! = 1.

Мы можем найти факториал, используя рекуррентную формулу

Fact.png

Рекурсивная функция обращается сама к себе. Но поскольку это не может продолжаться бесконечно, требуется определить условие выхода из процесса рекурсии. В нашем случае это равенство единице аргумента. Посмотрим, как вычисляется 5!

5! = 5∙4! = 5∙4∙3! = 5∙4∙3∙2! = 5∙4∙3∙2∙1! = 5∙4∙3∙2∙1 = 120

Если мы напишем рекурсивную функцию Fact(n), то при вызове Fact(5) она обратится сама к себе 4 раза. Количество таких обращений называется глубиной рекурсии. Если глубина рекурсии большая, ресурсов компьютера может не хватить, что необходимо учитывать при написании рекурсивных функций. Рекурсия может быть сведена к итерации, но к сожалению, этот процесс не всегда прост.

1 function Fact(n: integer): real := n = 1 ? 1.0 : n * Fact(n - 1);
2 
3 begin
4   Print(Fact(5));
5 end.
120

Возможна и иная запись функции

1 function Fact(n: integer): real := if n = 1 then 1.0 else n * Fact(n - 1);

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

Принято считать по определению, что 0! = 1.

1 function Fact(n: integer): real := if n <= 1 then 1.0 else n * Fact(n - 1);

Программирование рекурсивных функций отличается простотой, а код – наглядностью. Плата за это – расход ресурсов компьютера. Рекурсия может быть достаточно сложной, например, параметры рекурсивной функции могут иметь, в свою очередь, рекурсивное определение. Типичный представитель – функция Аккермана A(n, m). Она растёт очень быстро, например, число A(4, 4) уже настолько велико, что количество цифр в нем во много раз превосходит количество атомов в наблюдаемой части вселенной. А вот значение A(3,4) можно попробовать вычислить.