2016-02-12 119 views
0
def recursion(x): 
    answer = 0 
    if(x > 10): 
     answer +=1 
     return recursion(x - 1) 
    return answer 
recursion(15) 

我只是玩弄python和遞歸函數,並做了這個,但奇怪的是有錯誤。Python遞歸混淆

這是爲什麼打印0,而不是我期待的答案:

+2

因爲答案只能是1或0 ... –

+1

你是什麼意思?我返回的答案是從0開始,但是當x> 10時,我加1回答每個循環。所以第一個x是15,然後是14,13,12,11,這是5個循環加1回答。所以它不應該返回5嗎? – NewtoJava

+1

'answer'是一個局部變量。每次調用recursion()時,它都被聲明並設置爲零。 – dave

回答

1

你需要作出回答一個全局變量:

answer = 0 

def recursion(x): 
    global answer 
    ... 
+1

這是一個有趣的解決方案,我不會想到+1,因爲它將很容易讓OP瞭解...即使一般你想避免全局變量 –

1

正在發生的事情是,每次你打電話遞歸答案的值設置爲0的功能,您可以將其更改爲:

answer = 0 

def recursion(x): 
    global answer 
    if(x > 10): 
     answer += 1 
     return recursion(x - 1) 
    return answer 

recursion(15) 

和更好的實現將是:

def recursion(x): 
    if(x > 10): 
     return 1 + recursion(x - 1) 
    return 0 
+1

因此,通過在第4行輸入你的全局答案,你可以在方法中調用答案,它允許賦值答案+ = 1.哦,謝謝你好, t在使用全局變量之前 – NewtoJava

+0

沒錯,有一件事是您每次需要調用函數時都需要重置答案(使用此實現)。 – melalonso

1

因爲answer定義是在局部範圍內。

這意味着此函數調用中的answer與上次調用不一樣。

你的代碼應該是

def recursion(x , answer): 
    if(x > 10): 
     answer +=1 
     return recursion(x - 1 , answer) 
    return answer 
print(recursion(15 , 0)) 
+0

固體功能編程示例解決方案+1 –

0

的Cuz你的答案是一個局部變量,每次調用函數的時候,有一個「新的答案對」,就這樣:

遞歸(15 ):答案= 0答案+ = 1

遞歸(14):答案= 0答案+ = 1

...

遞歸(10):答案= 0跳轉如果然後返回答案遞歸(11), 然後遞歸(12)...... 爲你的程序的正確方法應該是:

answer = 0 
def recursion(x): 
    global answer 
    if(x > 10): 
     answer +=1 
     return recursion(x - 1) 
    return answer 
0

變量answer八方通返回0

更好的解決方案:

def recursion(x, answer): 
    if(x > 10): 
     answer +=1 
     return recursion(x - 1, answer) 
    return answer 
recursion(15, 0)