Технологии Программирования. 5 лекция
.pdf4.Рекурсивное вычисление чисел Фибоначчи
(Fibonacci numbers)
Fib(0) = 0
Fib(1) = 1
Fib(N) = Fib(N - 1) + Fib(N - 2) для N > 1
Пример:
Fib(2)= Fib(1) + Fib(0)
=[Fib(0) + Fib(-1)] + 0 =
=0 + [Fib(-2) + Fib(-3)] =
=[Fib(-3) + Fib(-4)] +
+ [Fib(-4) + Fib(-5)]
И т.д.
int fibonacci(int n)
{
if(n==1 || n==2) return 1;
/* else */
return fibonacci(n-1) + fibonacci(n-2);
}
void main()
{
printf("20оечисло = %d\n", fibonacci(20));
}
Рекурсия изнутри
fibonacci(5) |
Сделано переобозначение |
|
fibonacci -> Fib |
fibonacci(3) |
fibonacci(4) |
Fib(1) |
Fib(2) |
Fib(2) |
Fib(3) |
Fib(0) |
Fib(1) |
Fib(0) Fib(1) |
Fib(1) |
Fib(2) |
Fib(0) Fib(1)
5.Рекурсивное вычисление наибольшего общего делителя
(greatest common divisor, GCD)
•Наибольшим общим Математик Эйлер (XVIII век):
делителем двух чисел
называется наибольшее целое, на которое делятся два числа без остатка.
Например, GCD(12, 9)= 3.
•Два числа называются
взаимно простыми
(relatively prime), если их наибольший общий делитель равен 1.
Если A нацело делится на B,
то GCD(A, B) = В
иначе
GCD(A, B) = GCD(B % A, A)
Например:
GCD(9, 12)= GCD(12 %9, 9) = GCD(3, 9) = 3
Дом/задание
Написать компьютерную реализацию для нахождения наибольшего общего делителя
А) рекурсивно
Б) нерекурсивно
6. Функция Анкермана
|
А(0, п) = п+1 |
|
|
А(т, п) = |
|
А(т,0) = А(т−1, 0) |
m, n > 0 |
|
|||
|
|
А(т, п) = А((т−1), А(т, п−1)) |
|
|
|
|
|
long A (long m, long n) |
|
||
{if( m = =0) return n+1; |
|
||
else if( n==0) return (A(m-1, 0)); |
|
||
else |
|
return (A(m-1, A (m, n-1) )); |
|
} |
|
|
|
… |
|
|
|
main() |
|
|
|
{… |
|
|
|
// Вызов |
|
|
|
ANK=A (m, n) ;……}
Д/З Рекурсивное вычисление
1.xn
2.Сложения двух чисел
3.Перевод натурального числа из десятичной
системы счисления в двоичную
4. Нахождения максимального элемента в глобальном массиве
5. Нахождение суммы первых n членов
арифметической (геометрической) прогрессии.
6.Ввод с клавиатуры последовательности чисел
(окончание ввода - 0) и вывод ее на экран в обратном порядке.
Задача о Ханойских башнях*
Имеются три стержня с номерами 1,2,3. На стержень 1 надето n дисков
различного диаметра так, что они образуют пирамиду (см.рис.31). Написать программу для печати последовательности перемещений
дисков со стержня на стержень, необходимых для переноса пирамиды со
стержня 1 на стержень 3 при использовании стержня 2 в качестве вспомогательного. При этом за одно перемещение должен переноситься только один диск, и диск большего диаметра не должен помещаться на диск меньшего диаметра.
Доказано, что для n дисков минимальное число необходимых перемещений равно 2n-1.
Алгоритм решения
1)n=1 - одно действие - перенести диск со стержня i на стержень j, что очевидно (этот перенос обозначается i -> j).
2)перенести n>1 дисков со стержня i на стержень j, считая стержень w вспомогательным.
•перенести n-1 диск со стержня i на стержень w при вспомогательном стержне j,
•затем перенести один диск со стержня i на стержень j и,
•наконец, перенести n-1 диск из w на стержень j, используя вспомогательный стержень i.
Домашнее задание *
Написать Си программу, которая
1)вводит число n и печатает список перемещений,
решающая задачу о Ханойских башнях при количестве дисков n.
2)Используйте внутреннюю рекурсивную функцию
tn(n,i,j,w),
печатающую перемещения, необходимые для переноса n
дисков со стержня i на стержень j с использованием вспомогательного стержня w при {i,j,w} = {1,3,2}.