遞歸這個磨機的小妖精

神奇的遞歸

費了好大的勁纔對遞歸算法有了點淺顯的理解,在這與你們分享一下典型例子的代碼。python

九九乘法表

經典循環算法:web

for i in range(1,10):
    for j in range(1,i+1):
        result = i * j
        print("%s * %s = %s" %(j,i,result),end='\t')
    print()

遞歸算法實現:算法

def mul(i,j):
    if i >= 1:
        if j <= i:
            result = i * j
            print("%s * %s = %s\t" %(j,i,result),end='')
            j += 1
            # 設置遞歸退出界限條件,這很重要
            if j > i:
                j = 1
                i -= 1
                print()
            mul(i,j)
if __name__ == "__main__":
    # 這裏的輸出會是倒序排列的,你們能夠試一下修改傳遞的參數和判斷條件來實現正序排列
    mul(9,1)

漢諾塔

還有一個理解遞歸算法的經典案例,漢諾塔,這裏的代碼參考FishC論壇的小甲魚
這裏寫圖片描述svg

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序從新擺放在另外一根柱子上。而且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
其實算法很是簡單。當盤子的個數爲n時,移動的次數應等於2^n – 1(有興趣的能夠本身證實試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操做就能夠了。首先把三根柱子按順序排成品字型,把全部的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量肯定柱子的排放順序:若n爲偶數,按順時針方向依次擺放 A B C;若n爲奇數,按順時針方向依次擺放 A C B。ui

def hanoi(n,x,y,z):
    if n == 1:
        print(x+str(n)+' ---> '+z+str(n))
    else:
        hanoi(n-1,x,z,y)    # 將前n-1個盤子從x移動到y上
        print(x+str(n)+' ---> '+z+str(n))   # 將最底下的最後一個盤子從x移動到z上
        hanoi(n-1,y,x,z)    # 將y上的n-1個盤子移動到z上

n = int(input("Please input the number of Towers:"))
hanoi(n,"X","Y","Z")

以上是Python中的實現過程。lua

相關文章
相關標籤/搜索