2016-10-02 41 views
-1

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)

+2

你需要在你的問題更具體 - 什麼是「評估」該行的問題?該函數首先被調用,其結果被加上本地值'sum' – UnholySheep

+5

'+ ='和遞歸沒有什麼特別之處。您在右側有一個表達式,該表達式將被評估並添加到左側的對象中。遞歸調用在那裏沒有什麼不同。對於不可變類型,'x + = y'與'x = x + y'是一樣的。 –

+0

道歉,如果我根本不知道正確提問的問題。我知道所有這一切。關於評估,在'foo(sum,n-1)'中有兩個參數。那是怎麼加到'sum'上的?什麼被添加到'sum'?我從輸出中收集到,它只是加在sum上的'sum'參數,這導致了第二個問題:語句sum + = foo(sum,n-1)'調用另一個' foo(sum,n)',如果是這樣,爲什麼函數在完全耗盡'n == 0'處的'n'並調用'return'之前傳遞給'sum/2'? – whitehorse

回答

0

在Python中,x += y是相同x = x + y即添加到yx值並保存到x

在你的情況,sum += foo(sum, n-1)foo(sum, n-1)sum返回附加價值,並將其保存爲sum

它同樣也適用於*=-=等。例如:x *= y指具有x 乘法y和將其保存爲x。希望回答你的問題。

閱讀:Augmented Assignment Statements瞭解更多信息。

+4

* x + = y與x = x + y *相同:僅適用於不可變類型。對於可變類型,該選項存在用於就地更改對象。因此,對於列表,「+ =」與「list.extend()」相同,後跟名稱的重新綁定。 –

+0

感謝您的回覆。我有這樣的問題:具有多個參數的函數返回的值的性質是什麼,它允許將其添加到單個變量中?只有當左側的變量也是右側的參數之一時,這種形式才起作用嗎? 'mus + = foo(sum,n-1)'的輸出是什麼?還有一個後續問題:在上面的函數中,語句'sum + = foo(sum,n-1)'調用另一個'foo(sum,n)'的實例,如果是,爲什麼函數在'n == 0'完全耗盡'n'之前傳遞給'sum/2'並調用return? – whitehorse

0

雖然我還沒有確切地知道爲什麼給定函數產生它的輸出,我終於想出了這個主題的主要問題,即如何評估var += func(var, n-1)形式的語句。

雖然形式爲x += y的陳述足夠簡單易懂,但所討論語句右側的函數具有多個參數。我無法理解的是func(var, n-1)的哪個值被使用以及如何確定。所以我嘗試了一下。我在函數中添加了新的第一條語句mus = 3,並用mus += foo(sum, n-1)替換sum += foo(sum, n-1)並打印出結果。我顛倒了函數中的參數位置並檢查了結果。我添加了第三個參數,並檢查了該功能。每次在sum += foo(sum, n-1)的每個變體中調用sum的值。

然後我從return sum中刪除sum並運行它,它產生了一個TypeError然後它被點擊。所以我將它更改爲return n-1,然後這成爲sum += foo(sum, n-1)中所稱的值。我將它改爲我添加的新的第三個變量,return x,然後這就是所謂的值。

因此,爲了評估var += func(var, n-1)形式的語句,您必須檢查函數運行時基本情況下返回的參數。更正將不勝感激,如果我錯了〜