[英]Recursion - Python, return value question
我意識到這可能聽起來像一個愚蠢的問題,但我最后一次編程它是在匯編程序,所以我的想法可能是關閉的:
遞歸函數如下:
def fac(n):
if n == 0:
return 1
else:
return n * fac(n - 1)
為什么當函數達到n == 0時它不返回1而是返回因子。 我在思考類似於匯編程序的東西,當n == 0時:
mov eax, 1
ret
為什么上面的代碼工作,我想python在那個條件之前返回堆棧的最后一個值?
想想這樣,對於fac(5)
例如:
return 5 * fac(4)
return 4 * fac(3)
return 3 * fac(2)
return 2 * fac(1)
return 1 * fac(0)
1
因此1
將是第一個返回值,但它將返回到fac(1)
, fac(1)
將返回到fac(2)
,依此類推。
它返回1,當n == 0,即返回值被彈出從調用站點,這是在所述調用棧n * fac(n - 1)
將1
乘以n
並返回等。
如果你調用fac(0)它將返回1(不是0,但我想這只是你問題中的一個錯字)。 如果你調用fac(1),它將進入else子句,並在那里調用fac(0)
。 這將返回1.然后它將計算n * 1,即1,然后返回。 如果你調用fac(2)
它也會進入else子句,它將調用fac(1)
,如上所述將返回1,所以n*fac(n-1)
將為2,這是返回值fac(2)
。 等等。 我希望能為你解釋一下。
沒有任何東西被隱含地返回 - 當n = 0時,函數進入if語句,並直接從return 1
語句return 1
。 然而,這不是將“作為因子的答案”返回給用戶的點。 相反,它可能會將此值返回到由fac(1)調用的調用函數,該調用函數位於n * fac(n - 1)
分支的中間。 因此,將采取“1”返回,返回n*1
,也就是1到它的調用者。 如果那是fac(2),它將返回n * 1
或2給它的調用者,依此類推。
因此fac(5)被翻譯成:
fac(5) = 5 * fac(4) = 5 * (4 * fac(3) = 5 * (4* (3 * fac(2)) = 5 * (4* (3 * (2 * fac(1)) = 5 * (4* (3 * (2 * (1 * fac(0)) = 5*4*3*2*1*1
只有在通過每個上層返回1值之后,它才會返回到第一個調用者,並且每個階段的乘法都會給出答案。
James,當你對函數的最后調用(當n == 0)時,它只是調用堆棧中fac(n)的幾個實例之一。 如果你說print(fac(4)),那么堆棧本質上是:
fac(0)
fac(1)
fac(2)
fac(3)
fac(4)
print()
對fac(0)的最終調用適當地返回1,但是在Python中你已經請求了第一次調用fac(n),fac(4)的返回值。
不要認為它是一個循環,其中'ret'會爆發,返回簡單地結束幾個待處理的執行之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.