【Python】函数递归实例之字符串反转、汉诺塔问题分析
遞歸的定義
函數(shù)定義中調(diào)用函數(shù)自身的方式
兩個特性:
- 鏈條:計算過程存在遞歸鏈條
例如,n!=n*(n-1)!,n!與(n-1)!就構(gòu)成了遞歸鏈條 - 基例:基礎(chǔ)的實例,存在一個或多個不需要再次遞歸的基例
例如,當(dāng)n=0時,我們定義它的值為1這就是一種基例,它與其他的值之間不存在遞歸關(guān)系
遞歸的實現(xiàn)
函數(shù)+分支語句
遞歸本身是一個函數(shù),需要函數(shù)定義方式描述,用函數(shù)定義名字,在函數(shù)中調(diào)用本身。在函數(shù)內(nèi)部,我們要區(qū)分哪些是基例,哪些是鏈條,所以我們要使用一個分支語句對輸入?yún)?shù)進行判斷,基例和鏈條,分別編寫對應(yīng)代碼
我們假設(shè)參數(shù)的初始值為5,當(dāng)n等于5,它會返回n*fact(n-1)也就是執(zhí)行5×fact(4),但是當(dāng)前程序并沒有運算fact(4),不知道fact(4)的值,而fact(4)又調(diào)用了一個它自身函數(shù),就需要對當(dāng)前n等于4的時候的值做運算,計算機會開辟一段新的內(nèi)存,將計算n等于4的函數(shù)的運算值
以此類推,當(dāng)我們最后在計算機中開辟了一個新的內(nèi)存,計算fact(0)時,它會返回1,得到1 之后就會返回給fact(1)這段函數(shù),fact(1)執(zhí)行后它的結(jié)果會返回給fact(2),最后返回給fact(5)也就實現(xiàn)了遞歸。
字符串反轉(zhuǎn)
將字符串s反轉(zhuǎn)后輸出
s[::-1]這是列表切片中達到字符串反轉(zhuǎn)的
遞歸方式:
def rvs(s):if s == "":return selse:return rvs(s[1:]+s[0])字符串的基例就是字符串的最小形式,那就是空字符串,反轉(zhuǎn),就是它自己,如果字符串等于" "我們就返回它自身,如果字符串s不是空,它的反轉(zhuǎn)是什么呢,如果要實現(xiàn)遞歸過程,那就需要遞歸鏈條,遞歸鏈條很重要的就是,當(dāng)前操作和之前的一步之間的關(guān)系,為了將字符串s進行反轉(zhuǎn),我們可以將一個字符串的首字符放在其余字符的后面,構(gòu)成反轉(zhuǎn),將其余字符看成是反轉(zhuǎn)后的字符,這樣我們就完成一次字符串的反轉(zhuǎn)
斐波那契數(shù)列
df f(n):if n == 1 or n == 2 :return 1else :return f(n-1)+f(n-2)漢諾塔問題
count = 0 def hanoi(n,src,dst,mid): #n圓盤數(shù)量,src源柱子,dst目的柱子,mid過渡柱子global countif n == 1 :print("{}:{}->{}".format(n,src,dst))count += 1else :hanoi(n-1,src,mid,dst)print("{}:{}->{}".format(n,src,dst))count += 1hanoi(n-1,mid,dst,src) n = eval(input()) hanoi(n,"A","B","C")遞歸語句中主要在于尋找基例和鏈條,鏈條主要是當(dāng)前操作與前一步操作的關(guān)系,在漢諾塔問題中,當(dāng)前操作是借助過度柱子將盤子從源柱子挪到目的柱子,而前一步操作,源柱子變成了過渡柱子,即借助源柱子,將剩余盤子從過渡柱子挪至目的柱子,仔細(xì)分析有兩個盤子的時候,挪動最下面的盤子的過程就是當(dāng)前操,挪動最上面盤子的過程就是前一步操作。
總結(jié)
以上是生活随笔為你收集整理的【Python】函数递归实例之字符串反转、汉诺塔问题分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通信用卡积分在哪里兑换
- 下一篇: 【Python】递归绘制科赫曲线及科赫雪