2016-02-12 118 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)