遞迴函式及尾遞迴

2022-04-10 20:21:56 字數 2014 閱讀 1348

"""

自己呼叫自己的函式,一去一回就是遞迴函式

"""​

# 示例一

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 如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則...