今天主要學習了遞歸函數,已經嘗試了一些小例子,這裡拿階乘和漢諾塔來記錄下。 1、階乘函數 階乘很簡單,即n! = 1x2x3x...xn。 先用了常用的迭代函數來寫階乘,代碼如下,很簡單的函數 邏輯很簡單,不斷地給變數y進行迭代。因為是在學習遞歸,所以又用遞歸的方法,重新來寫一下。 原理就是,n! ...
今天主要學習了遞歸函數,已經嘗試了一些小例子,這裡拿階乘和漢諾塔來記錄下。
1、階乘函數
階乘很簡單,即n! = 1x2x3x...xn。
先用了常用的迭代函數來寫階乘,代碼如下,很簡單的函數
1 def factorial(x): 2 for x in range(1,x+1): 3 if x == 1: 4 y = 1 5 else: 6 y = y * x 7 return y 8 9 temp = int(input ('Please enter a number :')) 10 print(temp) 11 if temp == 0: 12 print ('0沒有階乘哦!') 13 else: 14 temp1 = factorial(temp) 15 print( "%d 的階乘為 %d" %(temp,temp1))
邏輯很簡單,不斷地給變數y進行迭代。因為是在學習遞歸,所以又用遞歸的方法,重新來寫一下。
原理就是,n! = n x (n-1)!
1 def factorial(n): 2 if n == 1: 3 return 1 4 else: 5 return n * factorial(n-1) #即n! = n * (n-1)! 6 7 number = int(input ('請輸入一個正整數')) 8 print (number) 9 result = factorial(number) 10 print("%d 的階乘是:%d" % (number,result))
用遞歸來寫的話,就感覺這個函數清晰明瞭多了。
2、漢諾塔游戲
背景:法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下麵的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
簡單說,就是有三根柱子(a,b,c),a柱子上有n個盤子,從上到下的盤子是從小到大,要求,把這n個盤子從a移動到c上,切移動的中間不允許大的盤子放在小的盤子上面。如圖:
思考這個問題的時候,我將其想成了三步走:把a軸上的n個盤子看做兩部分來理解,最下麵最大的1個盤子,以及其他的(n-1)個盤子.
1、如果將其當做兩部分,那麼第一步要做的,就是講上面的(n-1)個盤子,移動到b軸上;
2、第二步,然後將a軸上剩下的另外一部分即最後那1個盤子,從a軸移動到c軸;
3、第三步,再將b上的那一部分(n-1)個盤子,從b移動到c。
那麼,依據上面的三步走的考慮,寫出的代碼如下:
def hanoi(n,a,b,c): if n == 1: # 如果只有一個盤,那麼就是把這一個盤,從a軸(起始軸)移動到c軸(目標軸)。 print (a ,'-->', c) else: #如果有n個盤子 hanoi((n-1),a,c,b) #那麼第一步,就是先把(n-1)個盤子從a軸移動到b軸,以c軸為緩衝。此時,a軸為起始軸,b軸為目標軸,c軸為緩衝軸。 hanoi(1,a,b,c) #第二步,移動了(n-1)個盤子後,a軸還剩下1個,那麼就是把最後這個從a軸移動到c軸。即hanoi(1,a,b,c),a -->c。 hanoi((n-1),b,a,c) #第三步,將b軸上的(n-1)個盤子,從b軸移動到c軸,此時b為起始軸,a為緩衝軸,c為目標軸,即hanoi((n-1),b,a,c) n = int(input('請輸入漢諾塔層數')) hanoi(n,'A','B','C')
如此,當用戶輸入數字後,就可以得到想要的漢諾塔移動。
編譯一下試試
請輸入漢諾塔層數3 A --> C A --> B C --> B A --> C B --> A B --> C A --> C
得到這個結果,正確。