迭代與遞迴從本質上講,都是一種迴圈過程。迭代主要是在每一步中更新變數值來達到迴圈的目的,而遞迴則是在函式中呼叫自己來實現迴圈。迭代更直觀,我們一眼能夠看出程式執行過程,而遞迴則使得程式更加簡潔緊湊。
對於迭代,我們給定乙個迴圈指標、迴圈範圍以及需要更新的變數就可以進行迴圈了,例如
for i in
range(5
):a = i +
1print
(a)
在上面的python程式中,i為迴圈指標,迴圈範圍為[0,
4]
[0,4]
[0,4
],變數為i + 1。
對於遞迴,我們同樣需要三個基本要素才行,即:
例如:
def
func
(n):
# 功能函式:求前n個正整數的和
if n >1:
return n + func(n -1)
#函式關係
else
:return
1#基線條件
對於迭代,我們可以清楚地看出程式執行的過程,即i從0並且以1為步長進行迴圈,直至i=4,迴圈結束。
但是對於遞迴,我們乍一看,看不出迴圈指標,而當我們仔細研究定義的函式之後,就會發現,定義的函式中自己呼叫了自己,只不過對於每乙個n,呼叫了該函式對應於n-1的函式值,而每乙個n-1,又呼叫了該函式對應於n-2的函式值,…,以此類推,直至滿足基線條件,遞迴停止。我們以n=3為例,看一下遞迴中發生了什麼。
func(3) = 3 + func(2)
func(3) = 3 + (2 + func(1))
func(3) = 3 + (2 + 1)
-->func(3) = 6
最終,我們得到了前三個正整數的和。
讓我們以計算階乘為例,這也是各種教程中經常使用的例子。
階乘(factorial),是所有小於以及等於該數的正整數的積,並且定義0的階乘為1。
def
factorial
(n):
if n ==
0or n ==1:
return
1if n >1:
return n * factorial(n -
1)
很明顯,這是乙個遞迴問題,函式關係為f(n
)=f(
n−1)
+f(n
−2),
n≥
3f(n) = f(n-1) + f(n-2),n \ge 3
f(n)=f
(n−1
)+f(
n−2)
,n≥3
。我們來看一下python的**實現。
def
fibonacci
(n):
if n <=2:
return
1return fibonacci(n -1)
+ fibonacci(n -
2)
這也是一道經典的演算法題,說的是有乙隻青蛙,每一次可以跳上 1 級台階,也可以跳上2 級台階,問該青蛙跳上乙個n 級台階,總共有多少種跳法。
我們先來分析一下,假設對於n
nn級台階共有f(n
)f(n)
f(n)
中跳法,並且我們知道n=1
n = 1
n=1時,只有一種跳法,n=2
n = 2
n=2時,有兩種跳法,但是函式關係並沒有顯而易見,那麼如何尋找函式關係呢?
如果青蛙第一次跳上了1級台階,則剩餘n−1
n-1n−
1級還有f(n
−1
)f(n-1)
f(n−1)
種跳法,如果青蛙第一次跳上了2級台階,則剩餘n−2
n-2n−
2級還有f(n
−2
)f(n-2)
f(n−2)
種跳法,因此f(n
−1)+
f(n−
2)
f(n-1) + f(n-2)
f(n−1)
+f(n
−2)就是n
nn級台階的總跳法,也就等於f(n
)f(n)
f(n)
,看,我們找到了函式關係f(n
)=f(
n−1)
+f(n
−2
)f(n) = f(n - 1) + f(n - 2)
f(n)=f
(n−1
)+f(
n−2)
。準備擼**了:
def
leap
(n):
if(n <=2)
:return n
return leap(n -1)
+ leap(n -
2)
搞定!
等等,如果這只青蛙肌肉發達,可以在n級台階中跳上1級、2級、3級…n級台階,那麼有多少種跳法?
其實這還是遞迴,只不過f(n
)=f(
n−1)
+f(n
−2)+
f(n−
3)+.
..+f
(2)+
f(1)
f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1)
f(n)=f
(n−1
)+f(
n−2)
+f(n
−3)+
...+
f(2)
+f(1
)。對應的**為:
def
leap
(n):
if(n <=2)
:return n
num =
0for i in
range
(n):
i +=
1 num += leap(n - i)
return num
遞迴的基本思想就是這樣,記住三要素:功能函式、基線條件、函式關係。 青蛙跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。解題思路 1 如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 2 假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 3 總跳法為 f n f n...
青蛙跳台階
之前面試遇到了這種題目,不會,後來搜尋了一下,感覺分析的很好 青蛙跳乙個n階的台階,每次可以跳1階或者2階,求跳完n階y有多少種方法。分析 n 1,f n 1 n 2,f n 2 n 3,f n 3 n 4,f n 5 可以發現 f n f n 1 f n 2 由此也可以推想 比如要跳到第4階樓梯上...
青蛙跳台階
難易程度 中等 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。在不考慮青蛙健康狀況的情況下 求該青蛙跳上乙個n級的台階總共有多少種跳法。思路 在本題的描述中,青蛙的行動只有兩種可能 一次跳乙個台階或者兩個台階,設n階台階的跳法為 f n 如果第一次跳了一階,那麼剩下的n 1階的跳法為f n...