遞迴
解決問題的方法,將問題分解為規模更小的問題,直到可以用非常簡單直接的方式就可以解決。
最簡單的例子,給定乙個列表,返回所有數的和,如不考慮迴圈語句,即可使用遞迴來實現。意識到數列求和實際上是乙個乙個加法實現的。如何把規模比較大的問題變成小規模的問題來解決。
求和問題可以歸納為:
listsum(num) = first(num) + listsum(rest num)
def
listsum
(numlist):if
len(numist)==1
:return numlist[0]
else
:return numlist[0]
+ listsum(numlist[1:
])print
(listsum([1
,3,5
,7,9]))
遞迴的一些應用
2.1 整數轉換成任意進製
用整數除和求餘數兩個計算來講整數一步步拆開。問題分解為
(1)餘數總小於「進製基base」,是基本結束條件
(2)整數商成為最小規模問題,通過遞迴呼叫自身解決。
def
tostr
(n,base)
: convertstring =
"0123456789abcdef"
if n < base:
return convertstring[n]
else
:return tostr(n // base, base)
+ convertstring[n % base]
print
(tostr(
1453,16
))
2.2 分型樹的實現
遞迴生成的圖形就是分型,分形樹在不同尺度上都具有相似性的事物。
2.3 漢諾塔
def
movetower
(height, frompole,withpole,topole)
:if height >=1:
movetower(height -
1, frompole,topole,withpole)
movedisk(height, frompole,topole)
movetower(height -
1, withpole,frompole,topole)
defmovedisk
(disk, frompole,topole)
:print
(f"moving disk from to "
)movetower(3,
"#1"
,"#2"
,"#3"
)
資料結構 1 遞迴
為什麼要用遞迴 程式設計裡面估計最讓人摸不著頭腦的基本演算法就是遞迴了。很多時候我們看明白乙個複雜的遞迴都有點費時間,尤其對模型所描述的問題概念不清的時候,想要自己設計乙個遞迴那麼就更是有難度了。用歸納法來理解遞迴 數學都不差的我們,第一反應就是遞迴在數學上的模型是什麼。畢竟我們對於問題進行數學建模...
資料結構之遞迴
本篇是資料結構與演算法之美學習筆記 遞迴在電腦科學中指一種通過將重複問題分解為同列子問題來解決問題的方法。遞迴是一種常見的演算法或者程式設計技巧。很多資料結構和演算法的編碼實現都會使用到遞迴,比附dfs深度搜尋,前中後序二叉樹遍歷等等。遞迴需要滿足三個條件 1.乙個問題的解可以分成幾個解。子問題就是...
資料結構之遞迴
資料結構與演算法遞迴 class solution def factorial self,n if n 1 return 1else return n factorial n 1 如果查詢的資料是有序的,二分查詢演算法比順序查詢演算法更高效 defbinary search nums,v nums....