"""自己呼叫自己的函式,一去一回就是遞迴函式
"""
# 示例一
def digui(n):
print(n,"<====1===>")
if n > 0:
digui(n-1)
print(n,"<====2===>")
digui(5)
# 示例二 (階乘)
num = 1
def func(n):
global num
if n >0 :
func(n-1)
num *= n
return num
res = func(5)
print(res)
# 示例三 (階乘改進版)
def jiecheng(n):
if n <= 1:
return 1
return n*jiecheng(n-1)
res = jiecheng(5)
print(res)
# 總結(每次呼叫函式時,在記憶體中都會單獨開闢乙個空間,配合函式執行,這個空間叫做棧幀空間)
"""(1).遞迴是一去一回的過程,
呼叫函式時,會開闢棧幀空間,函式執行結束之後,會釋放棧幀空間
遞迴實際上就是不停的開闢和釋放棧幀空間的過程
每次開闢棧幀空間,都是獨立的乙份,其中的資源不共享
(2).觸發回的過程
1.當最後一層棧幀空間全部執行結束的時候,會觸底**,回到上一層空間的呼叫處
2.遇到return,會觸底**,回到上一層空間的呼叫處,
(3).寫遞迴時,必須給與遞迴跳出的條件,否則會發生記憶體溢位,藍屏宕機的情況.
如果遞迴層數過多,不推薦使用遞迴
"""
"""自己呼叫自己,並且非表示式
計算的結果要在引數當中完成.
尾遞迴無論呼叫多少次函式,都只占用乙份空間,但是目前cpython不支援.
"""# 示例一(階乘)
def jiecheng(n,endval):
if n <= 1:
return endval
return jiecheng(n-1,endval*n)
res = jiecheng(5,1)
print(res)
"""return 後面的表示式,一定是先計算完在返回
# **解析:
# 去的過程:
n = 5 return 5*jiecheng(5-1) => 5 * jiecheng(4)
n = 4 return 4*jiecheng(4-1) => 4 * jiecheng(3)
n = 3 return 3*jiecheng(3-1) => 3 * jiecheng(2)
n = 2 return 2*jiecheng(2-1) => 2 * jiecheng(1)
n = 1 return 1
# 回的過程:
n = 2 return 2*jiecheng(2-1) => 2 * jiecheng(1) => 2 * 1
n = 3 return 3*jiecheng(3-1) => 3 * jiecheng(2) => 3 * 2 * 1
n = 4 return 4*jiecheng(4-1) => 4 * jiecheng(3) => 4 * 3 * 2 * 1
n = 5 return 5*jiecheng(5-1) => 5 * jiecheng(4) => 5 * 4 * 3 * 2 * 1
return 5 * 4 * 3 * 2 * 1 => return 120
"""
# 示例二 (斐波那契數列)
def fbo(n):
if n <= 2:
return 1
return fbo(n-1) + fbo(n-2)
res = fbo(6)
print(res)
遞迴函式 頭遞迴和尾遞迴
學習總結自 像程式設計師一樣思考 v.anton spraul 著,徐波 譯 遞迴,也就是乙個函式直接或間接呼叫自身。一般來說,遞迴可以分為直接遞迴和間接遞迴。直接遞迴,是指函式自己呼叫自己的情況,而間接遞迴,是指呼叫其他函式時,在其他函式中又呼叫了自己的情況。現在,主要將遞迴分為頭遞迴和尾遞迴來學...
遞迴 尾遞迴
階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...
遞迴 尾遞迴
計算n的階乘 function add n return n function add n 1 斐波那契數列 1 1 2 3 5 8 13.function arr n else 如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則...