遞迴 從青蛙跳台階說起

2021-10-07 08:39:50 字數 3256 閱讀 6082

迭代與遞迴從本質上講,都是一種迴圈過程。迭代主要是在每一步中更新變數值來達到迴圈的目的,而遞迴則是在函式中呼叫自己來實現迴圈。迭代更直觀,我們一眼能夠看出程式執行過程,而遞迴則使得程式更加簡潔緊湊。

對於迭代,我們給定乙個迴圈指標、迴圈範圍以及需要更新的變數就可以進行迴圈了,例如

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