Лабораторная_работа_№__2-3(2_семестр)0
.pdfИнформатика и программирование |
Михайлова Е.А. |
Пример 2 |
|
Private Function BADfact2(n As Double) As Double
BADfact2=BADfact2(n-1)*n ‘ бесконечность !
End Function
2.Потеря памяти
|
N |
N −1 |
Пример |
S = ∑i = ∑i + N |
|
|
i=1 |
i=1 |
Пример
Private Function BadAdd(n As Double) As Double If n <= 0 Then
BadAdd =0
Else
BadAdd = BadAdd (n-1)+n
End If End Function
При каждом обращении функции к самой себе отводится память под несколько бесполезных переменных. В циклах, которые не включают друг друга можно использовать одинаковый счетчик для каждого цикла.
3.Необоснованное применение рекурсии
Если рекурсивный алгоритм можно реализовать с помощью рекуррентных соотношений, то это нужно использовать и избавиться от рекурсии.
Пример: Итерационное нахождение чисел Фибоначчи
Dim |
F0, F1, Fk |
As |
Long |
|
Dim |
n, k |
As |
Integer |
|
Input n |
|
|
|
|
F0 = 0 |
|
|
|
|
F1 = 1 |
|
|
|
|
For k = 2 To n |
|
|
||
|
Fk = F0 +F1 |
|
|
|
|
F0 = F1 |
|
|
|
|
F1 = Fk |
|
|
|
Next k |
|
|
|
|
Print Fk |
|
|
|
|
|
Если |
внимательно |
посмотреть на рекурсивные функции: факториал, числа |
|
11
Информатика и программирование Михайлова Е.А. Фибоначчи, то можно заметить, что последнее действие перед завершением рекурсии тоже является рекурсивным шагом. Последнее действие не обращается к себе. Этот тип в теле процедур или функций называется хвостовой рекурсией. Т.к. после этого шага в функции ничего не происходит существует простой способ ее устранения. Вместо рекурсивного вызова функции нужно установить параметры функции, которая эта функция получила бы, если бы был рекурсивный вызов. Пример:
Private Function Recurse (A As Integer) As Integer
‘Выполняются какие либо действия, которые
‘позволяют найти значение параметра В
Recurse(имя переменной) = Recurse(B) |
БЫЛО |
End Function |
|
Do While (not done) |
|
// |
|
A =B |
СТАЛО |
Loop
Однако существуют такие функции, которые невозможно задать без рекурсии. Пример
•Явновырожденная рекурсивная функция Анкермана
|
A(0, n) = n +1 |
|
A(m,0) = A(m −1,1) |
A(m, n) = |
A(m, n) = A(m −1, A(m, n −1))
m, n – натуральные, целые числа
•Самоподобные кривые
|
|
|
А) Кривые Гильберта |
Б) Кривые Коха |
В) Кривые Серпинского |
|
|
|
•Задача о нахождении пути в лабиринте (метод проб и ошибок, способ решения – перебор всех возможных вариантов)
•Задача о маршруте шахматного коня – пройти все поле шахматной доски, посещая
12
Информатика и программирование |
Михайлова Е.А. |
каждое поле только один раз. Конь находится в центре доски.
•Задача о расстановке восьми ферзей.
2. Задания
1.Реализовать рекурсивный алгоритм вычисления факториала. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм вычисления факториала.
2.Реализовать рекурсивный алгоритм возведения в степень. Учесть все возможные случаи. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм возведения в степень.
3.Реализовать рекурсивный алгоритм вычисления чисел Фибоначчи. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм вычисления чисел Фибоначчи.
4.Реализовать рекурсивный алгоритм вычисления наибольшего общего делителя двух чисел А и В. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм.
5.Реализовать рекурсивный алгоритм вычисления функции Анкермана. Вычислить глубину рекурсии.
6.Реализовать рекурсивный алгоритм сложения двух чисел. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм.
7.Реализовать рекурсивный алгоритм нахождение суммы первых n членов арифметической (геометрической) прогрессии. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм.
8.Реализовать рекурсивный алгоритм нахождение суммы первых n членов геометрической прогрессии. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм.
9.Реализовать рекурсивный алгоритм Ввода с клавиатуры последовательности чисел (окончание ввода - 0) и вывод ее на экран в обратном порядке. Вычислить глубину рекурсии. Для сравнения написать итерационный алгоритм.
Дополнительные задания
1.Реализовать рекурсивный алгоритм перевода натурального числа из десятичной системы счисления в двоичную
2.Реализовать рекурсивный алгоритм нахождения максимального элемента в глобальном массиве
3.Реализовать рекурсивный алгоритм построения кривых Коха.
13
Информатика и программирование |
Михайлова Е.А. |
4.Реализовать рекурсивный алгоритм построения кривых Серпинского.
5.Реализовать рекурсивный алгоритм построения кривых Гильберта.
*6. Разработать программу, реализующую рекурсивный алгоритм «Ход конем». *7. Разработать программу, реализующую рекурсивный алгоритм «Задача о расстановке восьми ферзей».
3. Контрольные вопросы
1.Дать определение рекурсии.
2.Приведите примеры рекурсивных алгоритмов и функций.
3.Что такое глубина рекурсии.
4.В чем заключаются опасности рекурсии и как их избежать.
5.Приведите пример рекурсивных функций, которые нельзя реализовать итерационным способом.
14
