遞迴問題1

2021-07-04 10:28:43 字數 1868 閱讀 3031

問題是這樣的:(1)乙隻青蛙一次可以跳上1級台階,也可以跳上2級求該青蛙跳上乙個n級的台階總共有多少種跳法。

問題再複雜點:(2)乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

這個是在牛客網上做程式設計訓練時碰到的第一題和第二題,題目要求的是利用遞迴的方式解決。

首先來分析下第乙個問題:

既然是遞迴的方式,先看看幾個簡單的例子:

有1級台階的時候,跳法有1種;

有2級台階的時候,跳法有2種;

有3級台階的時候,跳法有3種;

。。。。。

用n表示台階的數量,f(n)表示跳法的數量。

很容易得到,如果第一次跳1階的話,那麼就有f(n-1)次跳法了,如果第一次跳2階的話,那麼就有f(n-2)次跳法了,也就是:

f(n)=f(n-1)+f(n-2)

很熟悉的乙個表示式,斐波拉契數列啊。那麼程式就好解決了:

//c++**片段

class solution

};

#python**片段

# -*- coding:utf-8 -*-

class

solution:

defjumpfloor

(self,number):

if number < 0:

print

"error!"

if number == 1:

return

1; if number == 2:

return

2; else:

return self.jumpfloor(number-1)+self.jumpfloor(number-2)

有了對問題(1)的分析,再來分析問題(2)就容易了。同樣的分析:

有1級台階的時候,跳法有1種;

有2級台階的時候,跳法有2種;

有3級台階的時候,跳法有4種;

有4級台階的時候,跳法有8種;

可以看到與問題(1)的區別了。

假設有n級台階,如果第一次跳了1階,那麼就有f(n-1)種跳法,如果第一次跳了2階,那麼就有f(n-2)種跳法。。。如果第一次跳了n-1階,那麼就有f(n-(n-1))種跳法,那麼你可能發現了,這裡應該有:

f(2)=f(1)+f(0)才對,所以我們定義f(0)=1,這樣所有的情況就都符合了。也就是有:

f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)

f(n-1)=(fn-2)+f(n-3)+…+f(1)+f(0)

由上面兩個式子可以得到

f(n)-f(n-1)=f(n-1)

f(n)=2*f(n-1)

ok!得到這個式子,再用**寫出來就易如反掌了。

//c++**片段

class solution2

};

#python**片段

# -*- coding:utf-8 -*-

class

solution1:

defjumpfloor2

(self,number):

if number == 0:

return

1if number == 1:

return

1else:

return

2*self.jumpfloor2(number-1)

感覺不是在拼**程式設計功底,完全是在拼數學功底啊!雖然我的**也很渣。。。寫python函式,在類中呼叫jumpfloor的時候竟然還忘記了self的使用,簡直是不能忍啊,需要看的太多了,繼續努力!

動態規劃問題《遞迴問題》1

leetcode 每日一題日常打卡 面試題 17.16 按摩師問題 首先是問題描述 乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合 總預約時間最長 返回總的分鐘數。思考 ...

1 遞迴解決分魚問題

問題描述 a b c d e這5個人合夥夜間捕魚,凌晨時都已經疲憊不堪,於是各自在河邊的樹叢中找地方睡著了。第二天日上三竿時,a第乙個醒來,他將魚平分為5份,把多餘的一條扔回河中,然後拿著自己的乙份回家去了 b第二個醒來,但不知道a已經拿走了乙份魚,於是他將剩下的魚平分為5份,扔掉多餘的一條,然後只...

遞迴 例項1

已知有列表 l 3,5,8 10,13,14 15 18 1 寫出乙個函式print list lst 列印出列表中所有數字 print list l 2 寫出乙個函式sum list lst 返回列表中所有數字的和 print list sum list l 注 type x 可以返回乙個變數的型...