2014-02-27 72 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