簡體   English   中英

不理解遞歸函數的輸出

[英]Don't understand recursive function's output

def some_func(count):
    if count > 0:
        some_func(count-1)
        print(count)

print(some_func(5))

輸出是

1
2
3
4
5

在我的理解中,該函數將被簡化為 some_func(0) 並打印 0 作為最終輸出。 但實際輸出是從1到5? 每次迭代發生了什么?

提前致謝!

注意語句執行的順序!

some_func(5)
-- some_func(4)
---- some_func(3)
------ some_func(2)
-------- some_func(1)
---------- some_func(0)
---------- print(1)
-------- print(2)
------ print(3)
---- print(4)
-- print(5)

some_func(0) ,不滿足條件0>0 ,因此跳過some_funcprint(0)函數調用。

首先這里有縮進的問題,請更正,在函數末尾添加一點空白會使事情變得清晰。

def some_func(count):
    if count > 0:
        some_func(count-1)
        print(count)
        
print(some_func(5))

原因是,在遞歸中,遞歸調用旁邊的代碼被放入堆棧內存中,這是一個后進先出結構,您可以在此處找到有關它的更多信息堆棧,直到代碼的終止條件出現時才會推送后續的語句不斷發生在堆棧的頂部。 調用print(some_func(5))后會發生什么的示例可視化

  1. print(some_func(5)) : 5>0 => True, 所以下一個 cmd some_func(5-1) 被調用,此時有趣的事情發生了,在堆棧空間中some_func(count-1)所有后續語句都是推送然后實際的方法調用開始,所以此時堆棧將如下所示:
| TOP_OF_STACK |
|--------------|
| print(5)     |
  1. 要調用的下一行是 some_func(4): 然后又是 4>0 => True 所以 some_func(4-1) 被調用,隨后的 print(4) 被壓入堆棧,如下所示:
| TOP_OF_STACK |
|--------------|
| print(4)     |
|--------------|
| print(5)     |
  1. some_func(3): 3>0 => True,調用 some_func(3-1) 並將 print(3) 壓入棧頂。
| TOP_OF_STACK |
|--------------|
| print(3)     |
|--------------|
| print(4)     |
|--------------|
| print(5)     |

some_func(2) 和 some_func(1) 也是同樣的事情,堆棧的末尾看起來像這樣:

| TOP_OF_STACK |
|--------------|
| print(1)     |
|--------------|
| print(2)     |
|--------------|
| print(3)     |
|--------------|
| print(4)     |
|--------------|
| print(5)     |

當 some_func(0) 被調用時,會發生以下情況: 0>0 => false 所以 if 后面的語句不會被調用,所有已經被壓入堆棧的語句將從頂部依次彈出,這導致打印語句的執行導致輸出:

1
2
3
4
5

此外,有時您可能會遇到遞歸代碼堆棧溢出錯誤的一個可能原因是,如果您的終端條件不是有效的,那么推送會繼續發生,直到內存中沒有空間為止!

希望這能讓您更好地理解遞歸流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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