在這個函式中:
def print_triangle (sideLength):
if sideLength < 1 :
return
print_triangle (sideLength-1)
print ( "[]"* sideLength)
指令:
print ( "[]"* sideLength)
永遠不應該達到,因為指令:
print_triangle (sideLength-1)
當它不斷呼叫函式時會阻止它被訪問,這會將程式流再次發送到函式的開頭,即頂部。而不是讓它繼續低于:
print ( "[]"* sideLength)
因此,它將繼續這樣做,直到變數sideLength變為零。
然而這行:
print ( "[]"* sideLength)
當您使用 4 作為引數呼叫它時,到達并繪制一個三角形......但是如何?
uj5u.com熱心網友回復:
你可以想象遞回呼叫“樹”如下。每個框代表函式的一個執行背景關系,因此每次進行新呼叫時都會描繪一個新框。最里面的盒子代表引數為0的情況,在這種情況下,函式將回傳,關閉里面的盒子。但是,最里面的盒子的呼叫者將能夠繼續,它將繼續執行print指令。
所以這是最初的呼叫:
print_triangle(4)
┌───────────────────────────────────────────────────────┐
│ sideLength ══ 4 │
│ print_triangle(3): │
│ ┌──────────────────────────────────────────────┐ │
│ │ sideLength ══ 3 │ │
│ │ print_triangle(2): │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ sideLength ══ 2 │ │ │
│ │ │ print_triangle(1): │ │ │
│ │ │ ┌────────────────────────────┐ │ │ │
│ │ │ │ sideLength ══ 1 │ │ │ │
│ │ │ │ print_triangle(0): │ │ │ │
│ │ │ │ ┌───────────────────┐ │ │ │ │
│ │ │ │ │ sideLength ══ 0 │ │ │ │ │
│ │ │ │ │ return │ │ │ │ │
│ │ │ │ └───────────────────┘ │ │ │ │
│ │ │ │ print("[]"*1) │ │ │ │
│ │ │ └────────────────────────────┘ │ │ │
│ │ │ print("[]"*2) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ print("[]"*3) │ │
│ └──────────────────────────────────────────────┘ │
│ print("[]"*4) │
└───────────────────────────────────────────────────────┘
uj5u.com熱心網友回復:
好吧,考慮清楚。
def print_triangle (sideLength):
if sideLength < 1 :
return
print_triangle (sideLength-1)
print ( "[]"* sideLength)
print_triangle (4)
首先,它以 4 開頭
if 4 < 1 :
return
print_triangle (4-1)
print ( "[]"* 4)
現在,在它 print off 之前[]*4,它再次呼叫該函式,這次是 3:
if 3 < 1 :
return
print_triangle (3-1)
print ( "[]"* 3)
現在,在它列印 off 之前[]*3,它再次呼叫該函式,這次是 2:
if 2 < 1 :
return
print_triangle (2-1)
print ( "[]"* 2)
現在,在它列印 off 之前[]*2,它再次呼叫該函式,這次是 1:
if 1 < 1 :
return
print_triangle (1-1)
print ( "[]"* 1)
現在,在它列印 off 之前[]*0,它再次呼叫該函式,這次是 0。
現在我們知道,由于零小于 1,所以它回傳到最后一個函式,即 1。
現在我們回到最后一個函式呼叫。
print ( "[]"* 1)
然后到之前的那個:
print ( "[]"* 2)
然后是之前的那個:
print ( "[]"* 3)
最后是你對函式的第一次呼叫:
print ( "[]"* 4)
uj5u.com熱心網友回復:
它在回傳基本情況并且函式呼叫堆疊開始彈出后執行。
如果按如下方式撰寫,則交換最后兩行:
def print_triangle (sideLength):
if sideLength < 1 :
return
print ( "[]"* sideLength)
print_triangle (sideLength-1)
不同之處在于列印的三角形將上下顛倒。
uj5u.com熱心網友回復:
指令:
print ( "[]"* sideLength)永遠不應該達到,因為指令:
print_triangle (sideLength-1)會阻止它被訪問,因為它一直在呼叫該函式
這是不正確的。首先,“它一直在呼叫函式”是錯誤的。這只會呼叫該函式一次。當函式回傳時,它將繼續到下一行。
特別是,你有
if sideLength < 1 :
return
所以一旦sideLength到達0函式呼叫就會回傳。
作為一個更具體的例子,讓我們看看當你呼叫print_triangle(3). 首先,我們檢查if sideLength < 1,這是錯誤的,所以我們去print_triangle (sideLength-1)。
這是遞回呼叫print_triangle(2)。再次,我們檢查if sideLength < 1. 仍然下降,所以我們再次遞回print_triangle(1)。if sideLength < 1仍然是錯誤的,所以我們再遞回一次print_triangle(0).
但現在if sideLength < 1是真的,所以我們回來了。這讓我們回到sideLength1 的呼叫,但在遞回呼叫之后。下一行要執行的代碼是print ( "[]"* sideLength),它是如何執行的。
列印之后,我們再次從函式回傳到sideLength2 時。所以我們print()再次回傳sideLength設定為 3。在從頂級呼叫回傳之前再列印一次。
uj5u.com熱心網友回復:
如果您不回傳該值,則該函式將繼續運行,然后將重復。如此感動:
return print_triangle (sideLength-1)
之前 print( "[]"* sideLength)。將使 print() 只運行一次
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461012.html
