Рекурсия в ПРОЛОГе Понятие рекурсии Примеры рекурсивных объектов Рекурсивные правила в ПРОЛОГе Примеры рекурсивных правил Вычисление факториала Последовательность Фибоначчи Задача о Ханойских башнях Понятие рекурсии • Рекурсия — способ организации действий, при котором процесс обращается сам к себе. • Рекурсивным называется любой объект, который частично определяется через себя. Рекурсия в художественных образах Гравюра голландского художника Мориса Эшера "Рисующие руки" клип ПРИМЕРЫ РЕКУРСИИ У попа была собака, он её любил, Она съела кусок мяса, он её убил, В землю закопал, Надпись написал: "У попа была собака, он её любил, Она съела кусок мяса, он её убил, В землю закопал, Надпись написал: "У попа была собака, он её любил, Она съела кусок мяса, он её убил, В землю закопал, Надпись написал: … Рекурсия в природе Рекурсия в математике: Треугольник Серпиньского фрактал, один из двумерных аналогов множества Кантора предложенный польским математиком В. Серпиньским в 1915 году. Также известен как «решётка» или «салфетка» Серпиньского. Рекурсия в математике: Снежинка Коха Рекурсия в математике: Алгебраические фракталы Множество Мандельброта . Алгоритм построения основан на простом итеративном выражении: Z[i+1] = Z[i] * Z[i] + C, где Zi и C - комплексные переменные. Итерации выполняются для каждой стартовой точки C прямоугольной или квадратной области - подмножестве комплексной плоскости. Примеры рекурсивных определений 1. Сумма первых N натуральных S(N)=1+2+3+…+(N-1)+N чисел 1, если N 1 S ( N 1) N , если N 1 S(N)= 2. Степень с натуральным показателем Xn = Xn-1*X Xn = X , если n 1 n 1 * X , если N 1 X Рекурсивные правила в ПРОЛОГе Рекурсивное правило нерекурсивная часть (остановка рекурсии) Рекурсивная часть (обращение к себе) Примеры рекурсивных правил: Вычисление факториала 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 А В С