2014-02-27 69 views
1

我是Python新手,正在学习如何通过从项目euler进行练习来实现它。问题2的重点是针对我已经创造了这个递归函数的斐波那契序列:Python函数不返回

def CalcFb(start,end): 
    if (end<=4000000): 
     CalcFb(end,start+end) 
    else: 
     print "Returning:",end 
     return end 

print "Answer: {0}".format(CalcFb(start,start+1)) 

当我运行程序我得到以下输出:

Returning: 5702887 
Answer: None 

我打电话与功能:

start=1 

我不明白为什么被印有“无”应该印有5702887.可有人请帮助我明白这是为什么happeneing?

感谢 丹

+0

@Lafada您对该问题所做的编辑是*有害的*:您修正了代码中损坏的部分,使得O.P.发布的输出不会实际计算问题中的代码。这可能会让几个人愿意帮助浪费几分钟时间,试图弄清楚发生了什么。请在编辑时小心。代码可以被打破 - 这就是为什么问题被放置。 – jsbueno

+0

当然,下次我会确保它不会有害:) – Nilesh

回答

5

你缺少的return语句,如果子句中:

if (end<=4000000): 
    return CalcFb(end,start+end) 

否则你调用你的函数递归,但只有最后调用返回一个值,倒数第二个不是返回任何东西。

+0

好吧,发现了。非常感谢大家的帮助。 – Dan

3

递归时不必返回任何值...

def CalcFb(start,end): 
    if (end<=4000000): 
     return CalcFb(end,start+end) ### this needs to return a value as well 
    else: 
     print "Returning:",end 
     return end 
-2

对我来说它的返回2

>>> def CalcFb(start,end): 
...  if (end<=4000000): 
...   CalcFb(end,start+end) 
...  else: 
...   print "Returning:",end 
...  return end 
... 
>>> 
>>> start=1 
>>> print "Answer: {0}".format(CalcFb(start,start+1)) 
Returning: 5702887 
Answer: 2 

检查缩进。

+0

在更改代码以使“返回”语句超出“else”子句之后,它返回“2”。请在回答时在*您的*代码上进行更改,而不是在问题中发布的代码。 – jsbueno

+0

忽略我的评论 - 没有意识到OP的代码在我第一次看到它之前已经被编辑! – elParaguayo