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