Рекурсия

Download Report

Transcript Рекурсия

Рекурсия
Ако в дефиницията на някакъв обект се използва самият обект,
дефиницията на обекта е рекурсивна.
Подпрограма (процедура или функция), която се обръща пряко или косвено
към себе си, се нарича рекурсивна.
Пример: рекурсивна програма за намиране на n! (n е естествено число)
Във Visual Basic
...
Function fact(ByVal m As Integer) As Integer
If m = 0 Then
fact = 1
Else
fact = m * fact(m - 1)
End If
End Function
...
Dim n As Integer = 0
n = TextBox1.Text
TextBox2.Text = fact(n)
Изпълнение на програмата:
Отначало се обработват описанията. В резултат на променливата n се отделя
памет. Следва обръщение (извикване ) на функцита fact. В резултат се отделя
памет за името на функцията и нейния параметър m.
Оперативна памет (ОП):
Извикваща програма
първо обръщение към функцията
n
fact
m
3
...
3
Тъй като m=4 е различно от 0, изпълнява се fact = m * fact(m - 1), при което
трябва да се пресметне fact(m - 1), т.е fact(2). По такъв начин преди
завършване на първото обръщение към fact се прави второ обръщение към
тази функция. За целта се отделят нови клетки от ОП за името на функцията и
за нейния параметър m. Така имаме:
Оперативна памет (ОП):
Извикваща програма
1-во обръщение
2-ро обръщение
към функцията
към функцията
n
fact
m
fact
m
3
…
3
...
2
Тялото на функцията fact започва да се изпълнява за втори път (временно
спира изпълнението на тялото на функцията, предизвикано от първото
обръщение към нея).
По аналогичен начин възнокват още обръщения към функцията fact. При
последното от тях, стойността на параметъра m е равна на 0 и тялото на
функцията fact се изпълнява напълно. Така имаме:
Оперативна памет (ОП):
Извикваща
1-во
2-ро
3-то
4-то
програма
n
fact
m
fact
m
fact
m
fact
3
…
3
...
2
…
1
…
m
0
При последното обръщение (4-то) към fact стойността на m=0. В резултат,
изпълнението на това обръщание към функцията завършва и fact получава за
стойност 1. След това последователно (в обратна посока) завършват
изпълненията на останалите обръщения към функцията fact. При всяко
изпълнение на тялото на функцията се определя съответната стойност на
функцията. Така имаме:
Оперативна памет (ОП):
Извикваща
1-во
2-ро
3-то
4-то
програма
n
fact
m
fact
m
fact
m
fact
m
3
6
3
2
2
1
1
1
0
След всяко изпълнение на функцията fact, отделената за fact и m памет
се освобождава.
В този случай, рекурсивното дефиниране на функцията факториел не е
подходящо, тъй като съществува лесно итеративно решение:
Dim n As Integer = 0
Dim fact As Integer = 1
n = TextBox1.Text
For j As Integer = 1 To n
fact = j * fact
Next j
TextBox2.Text = fact
Препоръка: Ако за решаването на някаква задача може да се използва
итеративен алгоритъм , реализирайте го. Не се препоръчва винаги
използването на рекурсия, тъй като това води до загуба на памет и
време.