TL/DR您如何評估var += func(var, n-1)
表單的語句?遞歸形式var + = func(var,n-1)
編輯:通過「評估」我的意思是,如何確定本聲明右側調用的值。在下面給出的功能中,var += func(var, n-1)
總是導致sum += sum
。但爲什麼sum
總是被調用?爲什麼不是sum += (n-1)
?什麼決定右側調用哪個值?在一些回覆的幫助下,我想我已經找到了答案(見下文),但是更多關於這個主題的信息總是值得讚賞的。我只是在學習編程幾天。
我asked a question regarding a recursive function並收到了我滿意的答案,但提出了幾個問題。我一直在關注這個主題的前幾個問題,但我仍然錯過了一些東西。感覺遞歸是一個基本的概念,必須完全掌握才能在編程中取得成功,所以我想繼續提出問題,直到我明白爲止。回答者提供了另一個例子功能我考慮:
def foo(sum, n):
if (n == 0):
return sum
sum += foo(sum, n-1)
sum /= 2
return foo(sum, n-1)
我從來沒有見過+ =帶有多個參數的函數使用,我不知道如何評價這一點。我在sum += foo(sum, n-1)
和sum /= 2
之後加上print(sum)
,試着看看發生了什麼。運行foo(10, 3)
導致:
20
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
我決定改變+=
到*=
,看看是否會使發生了什麼事更清晰。這是程序:
def foo(sum, n):
if (n == 0):
return sum
sum *= foo(sum, n-1)
print(sum)
sum /= 2
print(sum)
return foo(sum, n-1)
foo(10, 3)
它產生了以下:
100
50.0
500.0
250.0
62500.0
31250.0
312500.0
156250.0
24414062500.0
12207031250.0
1907348632812500.0
953674316406250.0
9.094947017729283e+29
4.5474735088646414e+29
我可以跟蹤幾個不同的交織模式在此輸出,(即原來的總和10是所謂的第一,第二和第四個實例;輸出結果是兩個遞歸,兩個遞歸和三個遞歸組的輸出; sum/2
的輸出饋送第三,第五和第七個實例的輸入),但是我似乎無法在不知道如何評估的情況下解開它sum *= foo(sum, n-1)
或原始sum += foo(sum, n-1)
。
你需要在你的問題更具體 - 什麼是「評估」該行的問題?該函數首先被調用,其結果被加上本地值'sum' – UnholySheep
'+ ='和遞歸沒有什麼特別之處。您在右側有一個表達式,該表達式將被評估並添加到左側的對象中。遞歸調用在那裏沒有什麼不同。對於不可變類型,'x + = y'與'x = x + y'是一樣的。 –
道歉,如果我根本不知道正確提問的問題。我知道所有這一切。關於評估,在'foo(sum,n-1)'中有兩個參數。那是怎麼加到'sum'上的?什麼被添加到'sum'?我從輸出中收集到,它只是加在sum上的'sum'參數,這導致了第二個問題:語句sum + = foo(sum,n-1)'調用另一個' foo(sum,n)',如果是這樣,爲什麼函數在完全耗盡'n == 0'處的'n'並調用'return'之前傳遞給'sum/2'? – whitehorse