簡體   English   中英

遞歸 - Python,返回值問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM