<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
遞迴是一種較為抽象的數學邏輯,可以簡單的理解為「程式呼叫自身的演演算法」。
維基百科對遞迴的解釋是:
遞迴(英語:Recursion),又譯為遞迴,在數學與電腦科學中,是指在函數的定義中使用函數自身的方法。遞迴一詞還較常用於描述以自相似方法重複事物的過程。
例如,當兩面鏡子相互之間近似平行時,鏡中巢狀的影象是以無限遞迴的形式出現的。也可以理解為自我複製的過程。
"遞"是傳遞的意思,"歸"是歸還的意思,先把一個方法一層層傳遞下去,然後傳遞到最後一層再把結果歸還回來。
比方說我排隊做核酸檢測,前面有100個人,我想問下醫務人員幾點下班,於是問了我前面那兄弟,他又問了他前面的人,一個個傳遞下去,最終傳遞到了醫務人員那裡,回話說下午六點下班。這句話又往回傳,最終到了我這裡,我知道了醫務人員六點下班。
這個過程就是一個遞迴過程,如果說"傳話"本身是一種方法,那這整個傳話過程就是在呼叫自身方法,最終獲得了結果。
這和迴圈不一樣,迴圈相當於給所有人都所有人都戴了耳機,然後有"中介"挨個去問你知道醫務人員幾點下班嗎,等問到醫務人員的時候,得到答案,“中介”告訴我六點下班。
實質上,遞迴就是把一個大問題不斷拆解,像剝洋蔥一樣,最終拆解到最小層面,會返回解題結果。
用Python舉一個最簡單的遞迴函數例子,講一講什麼是遞迴的應用。
我們經常會看到函數會呼叫自身來實現迴圈操作,比如求階乘的函數。
整數n的階乘即n*(n-1)*(n-2)*...*3*2*1
如下面5行Python程式碼,就能實現階乘的計算
def fact(n): ''' n表示要求的數的階乘 ''' if n==1: return n n = n*fact(n-1) return n print(factorial(5))
輸出:
120
很多人可能困惑這裡面的計算邏輯,為什麼fact函數中呼叫了自身,最終能得到結果。
我們可以按照數學邏輯進行推演:
整數n的階乘是:fact(n) = n*(n-1)*...*3*2*1
整數n-1的階乘是:fact(n-1) = (n-1)*(n-2)*...*3*2*1
所以可以推斷 fact(n) = n*fact(n-1)
這裡是不是一種 fact方法可以為每個數所呼叫,最終呼叫到了n=1的時候,就返回結果n的階乘。
大家看上圖,遞迴函數會一層層往下呼叫,最終到n=1的時候,往上返回結果。
這就是遞迴的全過程,如果我們給遞迴下一個準確的定義,可以概括為以下3點:
1、至少有一個明確的遞迴結束條件;
2、給出遞迴終止時的處理辦法;
3、每次進入更深一層遞迴時,問題規模(計算量)相比上次遞迴都應有所減少
以上面程式碼為例:
def factorial(n): ''' n表示要求的數的階乘 ''' if n==1: # 1、明確遞迴終止條件; return n # 2、遞迴終止時的處理辦法 n = n*factorial(n-1) # 遞去 return n # 歸來
除了常見的階乘案例,還有斐波那契數列,也是遞迴的經典用法。
斐波那契數列:1,1,2,3,5,8,13,21,34,55,89...
這個數列從第3項開始,每一項都等於前兩項之和。
它以如下被以遞推的方法定義:F(0)=0,F(1)=1,F(n)=F(n - 1)+F(n - 2)(n≥ 2,n∈ N*)
在Python中,我們可以使用遞迴函數的方式去實現斐波那契數列:
# 1,1,2,3,5,8,13,21,34,55,試判斷數列第12個數是哪個? def fab(n): ''' n為斐波那契數列 ''' if n <= 2: v = 1 return v v = fab(n-1)+fab(n-2) return v print(fab(12))
使用數學方法進行推導:
其實以上兩個遞迴的案例都可以用數學歸納法來解釋,就是高中數學的知識。
一般地,證明一個與自然數n有關的命題P(n),有如下步驟:
(1)證明當n取第一個值n0時命題成立。n0對於一般數列取值為0或1,但也有特殊情況;
(2)假設當n=k(k≥n0,k為自然數)時命題成立,證明當n=k+1時命題也成立。
綜合(1)(2),對一切自然數n(≥n0),命題P(n)都成立。
除了數學的解釋,之前也看到有人對遞迴更加形象的解釋:
1、我們已經完成了嗎?如果完成了,返回結果。如果沒有這樣的終止條件,遞迴將會永遠地繼續下去。
2、如果沒有,則簡化問題,解決較容易的問題,並將結果組裝成原始問題的解決辦法。然後返回該解決辦法。
哈哈,到這裡大家是不是對遞迴有了一個更加深刻的認識。
如果還不清楚,沒關係,這裡還有更多的遞迴案例,用Python來實現,可以說非常簡潔。
「最大公因數:」
def gcd(m, n): if n == 0: return m else: return gcd(n, m%n)
「從 1 到 n 的數位之和:」
def sumnums(n): if n == 1: return 1 return n + sumnums(n - 1) print(sumnums(3))
「字串倒序:」
def reverse(string): if len(string) == 0: return string else: return reverse(string[1:]) + string[0] reverseme = '我是帥哥' print(reverse(reverseme))
「漢諾塔問題:」
def towerOfHanoi(numrings, from_pole, to_pole, aux_pole): if numrings == 1: print('Move ring 1 from', from_pole, 'pole to', to_pole, 'pole') return towerOfHanoi(numrings - 1, from_pole, aux_pole, to_pole) print('Move ring', numrings, 'from', from_pole, 'pole to', to_pole, 'pole') towerOfHanoi(numrings - 1, aux_pole, to_pole, from_pole) numrings = 2 towerOfHanoi(numrings, 'Left', 'Right', 'Middle')
「二分法找有序列表指定值:」
data = [1,3,6,13,56,123,345,1024,3223,6688] def dichotomy(min,max,d,n): ''' min表示有序列表頭部索引 max表示有序列表尾部索引 d表示有序列表 n表示需要尋找的元素 ''' mid = (min+max)//2 if mid==0: return 'None' elif d[mid]<n: print('向右側找!') return dichotomy(mid,max,d,n) elif d[mid]>n: print('向左側找!') return dichotomy(min,mid,d,n) else: print('找到了%s'%d[mid]) return res = dichotomy(0,len(data),data,222) print(res)
有位大佬說過:To Iterate is Human, to Recurse, Divine.
中文譯為:人理解迭代,神理解遞迴。
可見遞迴是非常神奇的演演算法,它的神奇之處在於它允許使用者用有限的語句描述無限的物件。
當然人無完人,遞迴也是有缺點的,它一般效率較低,且會導致呼叫棧溢位。
因為遞迴不斷呼叫自身函數,且產生大量變數,而棧空間的容量是有限的,迴圈太多就會效率低下,甚至導致呼叫棧溢位
以上就是Python範例詳解遞迴演演算法的詳細內容,更多關於Python遞迴演演算法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45