有意思的遞歸

2個遞歸經典的例子

先來一個入門的:
上初中學習數列求和什麼的時候我們就學過高斯的計算1到100的自然數的和的經典課文,那麼如果我們現在用程序的話該怎麼來做呢?
自然是循環來做這件事。
如果不用循環怎麼做呢?

def sum(first, end):
    if end == 1:
        return first
    elif end > 1:
        return sum(first + end, end-1)
print(sum(1,100))

結果是5050,根當時高斯算出來的結果是一樣的。
當然了,這個sum函數還能算任意的1到任何的n的自然數之和。

斐波那契數列
第一項是1,第二項是1,第三項是前倆項的和,依次類推。
表達式:F0=1,F1=1,F2=2,F3=3, …..Fn = Fn-1+Fn-2
實際的樣子:1,1,2,3,5,8,13,21…….

如果想得到第N項的值我們該如何做呢?

def fib(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    elif n > 2:
        return fib(n-1)+fib(n-2)

這樣的話我們就可以調用fib函數來算出第n項的值。

更有意思的就是漢諾塔了,

有3個杆子,有一個杆子上面套着從小到大的一排圓盤,要想把一個杆子上的所有圓盤都移動到另一個杆子上,條件是圓盤必須是大的在下面,小的在上面。要像將圓盤移動到另一個杆子上所用的最短的步數。

def move(n, A, B, C):
    if(n == 1):
        print(A, '->', C)
    else:
        move(n-1, A, C, B)
        move(1, A, B, C)
        move(n-1, B, A, C)

move(3, 'A', 'B', 'C') 

結果如下

A->C
A->B
C->B
A->C
B->A
B->C
A->C

是不是很神奇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章