from time import sleep
def refit(i, n, c=[]):
sleep(1)
print(c)
if i[:n] != '': refit(i[n:],n,c [i[:n]])
sleep(1)
print(c)
return c
使用引數“Helloo”和 2 時的輸出:
[]
['He']
['He', 'll']
['He', 'll', 'oo']
['He', 'll', 'oo']
['He', 'll']
['He']
[]
[]
陣列 ['He', 'll', 'oo'] 應該被列印并回傳,但代碼會自行撤消。怎么了?我感到很困惑。
uj5u.com熱心網友回復:
您的意思是將遞回呼叫的回傳值保存到refit()?
def refit(i, n, c=[]):
if i[:n] != '':
c = refit(i[n:], n, c [i[:n]])
return c
c = refit('Helloo',2)
print(c)
按要求輸出
uj5u.com熱心網友回復:
在對 的給定呼叫中refit,您不會更改c,因此c第二個中的值與第一個中的值print()相同print()。所有遞回呼叫都發生在這兩個print呼叫之間。
在第一次通話時,c是[]:
# i = 'Helloo', n = 2, c = []
print(c) # prints "[]"
if i[:n] != '':
refit(i[n:],n,c [i[:n]]) # prints a bunch of other stuff
print(c) # prints "[]"
return c # returns []
在第二次呼叫refit(上面用 表示# prints a bunch of other stuff)時,我們這樣做:
# i = 'lloo', n = 2, c = ['He']
print(c) # prints "['He']"
if i[:n] != '':
refit(i[n:],n,c [i[:n]]) # prints even more stuff
print(c) # prints "['He']"
return c # returns ["He"]
到目前為止,我們的輸出如下所示:
[]
['He']
(more stuff will go here)
['He']
[]
print不斷地——每個新的遞回呼叫在前一個呼叫的中間添加另一對陳述句。并且每個呼叫都回傳它的原始值c,而不是它從剛剛對 進行的遞回呼叫中獲得的新值refit。
如果你想讓這個函式回傳最里面的呼叫的結果,那么它只需要回傳呼叫的結果refit:
def refit(i, n, c=[]):
return refit(i[n:], n, c [i[:n]]) if i[:n] else c
print(refit("Helloo", 2)) # ['He', 'll', 'oo']
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425223.html
下一篇:遞回查找鏈中的元素
