日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python学习-递归(阶乘、汉诺塔)

發(fā)布時間:2023/12/19 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习-递归(阶乘、汉诺塔) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 求階乘(循環(huán))
  • 求階乘(遞歸)
  • 漢諾塔

求階乘(循環(huán))

如果需要求一個數(shù)的階乘,可能剛開始腦海里面冒出來的是循環(huán)計算,下面看看循環(huán)如何實現(xiàn):

def recur1(num):rst1 = 1for item in range(1, num + 1):print(item)rst1 = rst1 * itemprint(rst1)return rst1recur1(5)

為了體現(xiàn)變化,我這里把每個值都打印出來了。
運行結(jié)果:

1 * 2 * 3 * 4 * 5 = 120

求階乘(遞歸)

如果不使用循環(huán),我們可以使用遞歸的方式,下面解釋一下遞歸的定義:
遞歸算法(英語:recursion algorithm)在計算機科學中指一種通過重復而將問題分解為同類的子問題來解決問題的方法。
使用遞歸式方法可以解決很多的計算機科學的問題,它是計算機科學中十分重要的概念。絕大多數(shù)編程語言支持函數(shù)的自調(diào)用,因此在這些語言中函數(shù)可以通過調(diào)用自身來進行遞歸。
計算理論可以證明遞歸的作用完全可以取代循環(huán),在很多函數(shù)編程語言(如Scheme)中習慣用遞歸來實現(xiàn)循環(huán)。
這段話摘抄自百度詞條,也是為了讓自己更清楚遞歸的含義。
下面來看實現(xiàn):

def recur2(num):if num == 1:return numreturn num * recur2(num - 1)print(recur2(5))

運行結(jié)果:120

在示例中我們能看到,代碼比使用循環(huán)簡潔了不少,而且意義更明了。
下面這段話也要注意:
基線條件(base case)。基線條件是遞歸程序的最底層位置,在此位置時沒有必要再進行操作,可以直接返回一個結(jié)果。
所有遞歸程序都必須至少擁有一個基線條件,而且必須確保它們最終會達到某個基線條件;否則,程序?qū)⒂肋h運行下去,直到程序缺少內(nèi)存或者棧空間。

推薦另一篇關(guān)于遞歸的文章,寫得很詳細,也很用心,如果我的博文有幸被你們看到,那可以去看看他的這篇:Python遞歸算法詳解
寫得很詳細的,內(nèi)容更豐富。

默認的Python有一個可用的遞歸深度的限制,以避免耗盡計算機中的內(nèi)存。默認是1000。

當然遞歸的優(yōu)點和缺點都是很明顯的,從剛才推薦的這篇博文里面截了一張圖,大家可以看看。

漢諾塔

有一座鉆石寶塔A,其上有64個金蝶。所有碟子按從大到小的次序從塔底堆放至塔頂。緊挨著這座塔有另外兩個鉆石寶塔B和C。每次只能移動一個碟子,任何時候都不能把一個碟子放在比它小的碟子上面。把A上的碟子全部移到C上。
這個如果不用遞歸,實現(xiàn)起來,難度太大,畢竟次數(shù)太多了。
使用遞歸看著就會很簡單了,上代碼:
使用遞歸解決問題,首先需要化繁為簡,簡化步驟,明確要實現(xiàn)的功能。

def Hanoi(n, A, B, C) :if (n == 1) :move(A, c) #表示只有一個碟子時,直接從A塔移動到C塔else :Hanoi(n - 1, A, C, B) #將剩下的A塔上的n-1借助C塔移動到B塔move(A, C) #將A上最后一個直接移動到C塔上Hanoi(n - 1, B, A, C) #將B塔上的n-1個碟子借助A塔移動到C塔

這段代碼就是對漢諾塔使用遞歸實現(xiàn)的一種解析,綜合起來分成三步。
實現(xiàn)代碼:

iBeg = 1def move(iNum, frm, to):global iBeg# print("第%d步:將%d號盤子從%s -> %s" % (iBeg, iNum, frm, to))iBeg += 1def hanoi(iNum, a, b, c):if iNum == 1:move(1, a, c)else:hanoi(iNum - 1, a, c, b)move(iNum, a, c)hanoi(iNum - 1, b, a, c)iNum = int(input("請輸入一個數(shù)字:")) if isinstance(iNum, int):if 0 > iNum or iNum > 64:print("請輸入一個0-64之間的整數(shù)!")else:hanoi(iNum, 'A', 'B', 'C')print("移動步數(shù):", iBeg) else:print("請輸入一個整數(shù)!")

大家可以自己運行試試,move函數(shù)里面有個注釋,如果運行數(shù)字比較小,10以內(nèi),那就可以放開注釋,看看運行步驟。如果數(shù)字較大,還是直接運行吧。

如果大家電腦性能不太好,那還是不要嘗試64個盤子的漢諾塔了,太耗時
本來想測試一下64個盤子要循環(huán)多少次,不過跑了一個小時還沒跑出來。10,20都能很快跑出結(jié)果,30跑了幾分鐘,運行出結(jié)果了:

下面這張圖是比較直觀的一種方式,在ppt里面,插入這幾個形狀,然后自己挪動一下,從A按步驟,挪動到C,對這個思路就比較的清晰了。

還有一個斐波拉契數(shù)列,這個遞歸實現(xiàn)網(wǎng)上很多,我這里沒有去自己實現(xiàn),所以不貼代碼了。

總結(jié)

以上是生活随笔為你收集整理的python学习-递归(阶乘、汉诺塔)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。