Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии Программирования. 5 лекция

.pdf
Скачиваний:
12
Добавлен:
27.05.2015
Размер:
925.27 Кб
Скачать

4.Рекурсивное вычисление чисел Фибоначчи

(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}.