python之路——演算法與資料結構入門(二)
阿新 • • 發佈:2021-01-04
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
文章目錄
一、什麼是遞迴
遞迴就是不斷的呼叫自己
示例1:
import sys
# print(sys.getrecursionlimit()) # 預設最大遞迴限制:1000
# sys.setrecursionlimit(999999999) # 不管數值多大,最多到20963冊
def recursion(n):
print(n)
recursion(n + 1)
1.必須有一個明確的結束條件,要不就會變成死迴圈了,最終撐爆系統
2.每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3.遞迴執行效率不高,遞迴層次過多會導致棧溢位
實列2:
def func1(x):
if x > 0:
print(x)
func1(x - 1)
def func2(x):
if x > 0:
func2(x - 1)
print(x)
func1(3)
print("——————")
func2(3)
輸出
3
2
1
——————
1
2
3
二、漢諾塔問題
1。問題引入
漢諾塔問題源於印度一個古老傳說。相傳大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?
2.演算法分析
n個盤子時:
1.把n-1個盤子從a經過c移動到b
2.把第n個盤子從a移動到c
3.把n-1個盤子從b經過a移動到c
程式碼如下(示例):
def hanoi(n, a, b, c):
if n > 0:
hanoi(n - 1, a, c, b)
print("從%s移動到%s" % (a, c))
hanoi(n - 1, b, a, c)
hanoi(5, "A", "B", "C")
—————————————————————————————————————————————————————————————————————————
從A移動到C
從A移動到B
從C移動到B
從A移動到C
從B移動到A
從B移動到C
從A移動到C
3.總結
1.漢諾塔移動次數的遞推式:h(x)=2h(x-1)+1
2.h(64)=18446744073709551615
3.假設婆羅門每秒搬一個盤子則總共需要5800億年!