Рекурсия - Agpu.net
Download
Report
Transcript Рекурсия - Agpu.net
Рекурсия в ПРОЛОГе
Понятие рекурсии
Примеры рекурсивных объектов
Рекурсивные правила в ПРОЛОГе
Примеры рекурсивных правил
Вычисление факториала
Последовательность Фибоначчи
Задача о Ханойских башнях
Понятие рекурсии
• Рекурсия — способ организации
действий, при котором процесс
обращается сам к себе.
• Рекурсивным называется любой
объект, который частично
определяется через себя.
Рекурсия в художественных образах
Гравюра голландского художника Мориса Эшера
"Рисующие руки"
клип
ПРИМЕРЫ РЕКУРСИИ
У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
"У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
"У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
…
Рекурсия в природе
Рекурсия в математике:
Треугольник Серпиньского
фрактал, один из двумерных аналогов множества Кантора
предложенный польским математиком В. Серпиньским в 1915
году. Также известен как «решётка» или «салфетка»
Серпиньского.
Рекурсия в математике:
Снежинка Коха
Рекурсия в математике:
Алгебраические фракталы
Множество Мандельброта .
Алгоритм построения основан на простом итеративном выражении: Z[i+1]
= Z[i] * Z[i] + C, где Zi и C - комплексные переменные. Итерации
выполняются для каждой стартовой точки C прямоугольной или
квадратной области - подмножестве комплексной плоскости.
Примеры рекурсивных определений
1. Сумма первых N
натуральных
S(N)=1+2+3+…+(N-1)+N
S(N)=
чисел
1, если N 1
S ( N 1) N , если N 1
2. Степень с натуральным показателем
Xn = Xn-1*X
Xn =
X , если n 1
X n 1 * X , если N 1
Рекурсивные правила в ПРОЛОГе
Рекурсивное правило
нерекурсивная часть
(остановка рекурсии)
Рекурсивная часть
(обращение к себе)
Примеры рекурсивных правил:
Вычисление факториала
n!=1*2*3*...*(n-1)*n.
1, если n 0
n!=
( n 1)!* n , если n 0
Граничное условие: n=0
% нерекурсивная часть правила : 0! = 1
fact (0, 1):- !.
% рекурсивная часть правила: n! = (n-1)!*n
fact (N, FN):- M=N–1, fact (M, FM), FN=FM*N.
fact (0, 1):- !.
fact (N, FN):- M=N–1, fact (M, FM), FN=FM*N.
fact (3, FN)
----------------------N=3 FN= 6
M=N-1
-------------2=3 -1
fact (2, FM)
----------------------M=2 FM= 2
M’=M-1
-------------1=2 -1
fact (1, FM’)
----------------------M’ = 1 FM’= 1
M’’=M’-1
-------------0=1 -1
fact (0, FM’’)
----------------------M’’=0 FM’’= 1
FN=FM*N
----------------FN=2*3=6
FM=FM’*M
------------------FM=1*2=2
FM’=FM’’*M’
-------------------FM’=1*1=1
Примеры рекурсивных правил:
Числа Фибоначчи
F(1)=1, Ff(2)=1, F(n)=F(n-1)+F(n-2).
1, 1, 2, 3, 5, 8, 13, 21,...
1, если n 2
F(n) =
F ( n 1) F ( n 2 ), если n 2
Правило для вычисления n-го
числа Фибоначчи
fib(N,F),
N-порядковый номер, F- значение N-го числа
Фибоначчи
fib(1,1):-!.
%F(1) =1
fib(2,1):-!.
%F(2) =1
fib(N,F):%F(N)=F(N-1)+F(N-2)
N1=N-1,fib(N1,F1),
N2=N-2,fib(N2,F2), F=F1+F2.
Задача о Ханойских башнях
Решение при N=3
A
B
C
Разложение исходной задачи на подзадачи:
(1) Переложить 1,2-й диски с А на В (А→В)
(2) Переложить 3-й диск с А на С (А→С)
(3) Переложить 1,2-й диски с В на С (В→С)
Решение подзадач:
1,2
(1)А → В:
1,2
А→С
А→В
(3)B → C: B→A B→C
A
B
A
B
C
C→В
А→C
C
Рекурсивное правило для N дисков
move(1,A,B,C):write("Перенести диск с ", A, " на ",C),nl,!.
move(N,A,B,C):M=N-1,move(M,A,C,B),
write("Перенести диск с ", A ," на ",C),nl,
move(M,B,A,C).
Задача о Ханойских башнях
Перенести диск с A на
Перенести диск с A на
Перенести диск с B на
Перенести диск с A на
Перенести диск с C на
Перенести диск с C на
Перенести диск с A на
Перенести диск с A на
Перенести диск с B на
Перенести диск с B на
Перенести диск с C на
Перенести диск с B на
Перенести диск с A на
Перенести диск с A на
Перенести диск с B на
B
C
C
B
A
B
B
C
C
A
A
C
B
C
C
Количество перемещений
2n -1
А
В
С