函式的遞迴(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...