最近在學習MITx - 6.00.1x,對課程中講解的遞歸做了一個簡單的筆記。以下是應用遞歸思想解決漢諾塔和斐波那契數列問題的總結。
漢諾塔
有三根桿子A、B、C。A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將將所有圓盤移至C桿:
- 每次只能移動一個圓盤;
- 大盤不能疊在小盤上面。
思路
解法的基本思想是遞歸。先把A塔頂部的N-1塊盤移動到B塔,再把A塔剩下的大盤移到C,最后把B塔的N-1塊盤移到C。
每次移動多于一塊盤時,則再次使用上述算法來移動。
Python實現
def printMove(A,C):
print('move from '+str(A)+'to '+str(C));
def Towers(n,A,B,C):
if n==1:
printMove(A,C);
else:
Towers(n-1,A,C,B);
Towers(1,A,B,C);
Towers(n-1,B,A,C);
斐波那契數列
在數學上,斐波那契數列是以遞歸的方法來定義:
Fn=Fn-1+Fn-2,其中初值F1=1,F2=1,或者F0=1,F1=1。
模型
以兔子的繁殖為模型來描述此數列:
- 第一個月初有一對新生的兔子;
- 過一個月后,兔子會發育成熟,在第二個月末,會誕生一對新兔子;
- 每月月末每對發育成熟的兔子會誕生下一堆新兔子;
- 兔子永遠不會死去。
問題:每個月末會有多少只雌兔。
分析過程
- 第一個月初,有一只雌兔;
- 第一個月末,仍然只有一只雌兔(正在懷孕);
- 第二個月末,有兩只雌兔,一只是新生的,一只可生育;
- 第三個月末,可生育的兔子會生下一對新的兔子,總共有三只雌兔;
- 第n個月末,雌兔(n)=雌兔(n-1)+雌兔(n-2)。因為在第(n-2)月的每對兔子將會在第n月生下一對新兔子,再加上第(n-1)月原有的雌兔數量,即為第n個月末雌兔的數量。
Month | Females |
---|---|
F0 | 1 |
F1 | 1 |
F2 | 2 |
F3 | 3 |
F4 | 5 |
F5 | 8 |
Python實現
def fib(n):
"""assumes n an int >= 0
returns Fibonacci of n"""
assert type(n)==int and n>0
if n==0 or n==1:
return 1
else:
return fib(n-1)+fib(n-2)