python 函式的遞迴

2021-09-25 20:12:54 字數 3421 閱讀 4805

函式的遞迴(recursion)是程式語言裡的重要組成部分,那麼什麼是函式的遞迴呢?函式的遞迴就是函式自己呼叫自己,直到找到乙個返回值,再按照一定的規則返回函式的結果。遞迴的實現,是函式對本身的呼叫,每次呼叫時都會棧中進行操作,當沒有返回時,程式出現bug

在python語言中,設定了遞迴的層數,一般是100層,當超過這個層數的時候,python會丟擲乙個錯誤,結束遞迴

>>> def recursion():

return recursion()

>>> recursion()

traceback (most recent call last):

file "", line 1, in recursion()

file "", line 2, in recursion

return recursion()

file "", line 2, in recursion

return recursion()

file "", line 2, in recursion

return recursion()

[previous line repeated 991 more times]

recursionerror: maximum recursion depth exceeded

但是我們可以設定遞迴函式遞迴的層數,這時需要引入sys庫

import sys

sys.setrecursionlimit(所要設定的層數)

遞迴雖好,但是會占用大量記憶體資源,遞迴還具有一定的危險性,自己對自己的呼叫容易造成死迴圈

遞迴函式的常見例子:

遞迴求階乘

def fact(n):

if n == 1:

return 1

if n > 1:

return n * fact(n-1)

n = input("請輸入所求階乘數:\n")

while true:

try:

print("%s的階乘為:%d" % (n , fact(eval(n))))

n = input("請輸入所求階乘數:\n")

except:

print("請輸入數字!")

break

請輸入所求階乘數:

55的階乘為:120

請輸入所求階乘數:

遞迴求斐波那契數列

def fb(n):

if n == 1:

return 1

if n == 2:

return 1

if n > 2:

return fb(n-1) + fb(n-2)

while true:

try:

n = input('請輸入入計算斐波那契數列的項數:\n')

if not isinstance(eval(n),int):

continue

elif int(n) < 1:

print("請輸入大於1的整數")

continue

else:

for i in range(1,int(n)+1):

print("%d--->%d" %(i, fb(i)))

#n = input('請輸入入計算斐波那契數列的項數:\n') input()再迴圈體內不用再次輸入

except:

break

請輸入入計算斐波那契數列的項數:

81--->1

2--->1

3--->2

4--->3

5--->5

6--->8

7--->13

8--->21

同樣可以利用迭代實現斐波那契數列

x , y = 0 , 1

while true:

n = eval(input("請輸入需要計算的斐波那契數列的項數:\n"))

for i in range(1,n+1):

x , y = y , x + y

print("%d ---> %d" %(i , y ))、

>>>請輸入需要計算的斐波那契數列的項數:

81 ---> 1

2 ---> 2

3 ---> 3

4 ---> 5

5 ---> 8

6 ---> 13

7 ---> 21

8 ---> 34

請輸入需要計算的斐波那契數列的項數:

漢諾塔問題:

漢諾塔問題是古代的乙個問題,問題的大概是:給出三個木柱x,y,z,其中x堆疊著從低端到頂端由大到小的圓盤,要求把所有的圓盤借助y移動到z,要求每一次只能移動乙個,並且小的圓盤永遠在大的圓盤的上面

def hanoi(n,x,y,z):

global count #對於count需要宣告全域性變數,否則在函式結束後被釋放

if n == 1:

print(x + "--->" + z) # n 為1 時直接移動

count += 1

else:

hanoi(n-1,x,z,y) # n-1 個先由x 移動到 y

print(x + "--->" + z) #剩餘的乙個 x 移動到 z

count += 1 #列印都要次數加一

hanoi(n-1,y,x,z) # n-1 個由 y 移動到 z

while true:

count = 0

n = eval(input("請輸入漢諾塔的層數:輸入小於1的數結束迴圈\n"))

if n < 1 :

print("結束迴圈計算迴圈!")

break

else:

hanoi(n,"x","y","z")

print("移動次數為:%d" %count)

3

x--->z

x--->y

z--->y

x--->z

y--->x

y--->z

x--->z

移動次數為:7

請輸入漢諾塔的層數:輸入小於1的數結束迴圈

4x--->y

x--->z

y--->z

x--->y

z--->x

z--->y

x--->y

x--->z

y--->z

y--->x

z--->x

y--->z

x--->y

x--->z

y--->z

移動次數為:15

在移動時,往往借助另乙個完成移動,因此就用到了遞迴,遞迴時,三個柱子作用發生互換

Python的遞迴函式

特點 特點 函式內部的 是相同的,只是針對引數不同,處理的結果不同 當引數滿足乙個條件時,函式不再執行 示例 def sum numbers num print num 遞迴的出口很重要,否則會出現死迴圈 需求 定義乙個函式sum numbers 能夠接收乙個num的整數引數 計算 1 2 num ...

python遞迴函式例項 python遞迴函式

python遞迴函式 什麼是遞迴?遞迴,就是在函式執行中自己呼叫自己 示例 def recursion n 定義遞迴函式 print n 列印n recursion n 1 在函式的執行種呼叫遞迴 recursion 1 呼叫函式 這個函式在不斷的自己呼叫自己,每次呼叫n 1,看下執行結果 998t...

python靜態遞迴函式 python遞迴函式

一 遞迴的定義 1.什麼是遞迴 在乙個函式裡在呼叫這個函式本身 2.最大遞迴層數做了乙個限制 997,但是也可以自己限制 1 deffoo 2 print n 3 n 1 4 foo n 5 foo 1 驗證997 3.最大層數限制是python預設的,可以做修改,但是不建議你修改。因為如果用997...