2010-06-01 131 views
0

我有不少很難搞清楚發生了什麼事情錯在這裏:遞歸函數不能正常工作

class iterate(): 
    def __init__(self): 
     self.length=1 
    def iterated(self, n): 
     if n==1: 
      return self.length 
     elif n%2==0: 
      self.length+=1 
      self.iterated(n/2) 
     elif n!=1: 
      self.length+=1 
      self.iterated(3*n+1) 

例如,

x=iterate() 
x.iterated(5) 

輸出None。它應該輸出6,因爲長度看起來像這樣: 5 - > 16 - > 8 - > 4 - > 2 - > 1

經過一些調試,我看到self.length返回正確,但在遞歸中出了點問題。我不太確定。謝謝你的幫助。

+0

?我通常使用Python 2.6,init需要聲明爲__init__。但是,這明顯爲你運行,所以我想知道什麼版本的Python允許這個 – inspectorG4dget 2010-06-01 00:39:54

+0

@ inspectorG4dget - 提供的源代碼有兩個下劃線圍繞'init',但它們最初被格式化刪除,而不是顯示(我'猜測是你的評論也發生了什麼)。我已經修復了現在問題的格式。 – 2010-06-01 01:10:02

+0

@ire_and_curses:看來。看起來像雙下劃線是文本格式爲粗體! – inspectorG4dget 2010-06-01 02:17:18

回答

4

在兩個elif塊中,遞歸調用後不返回值。在遞歸調用iterated(例如return self.iterated(n/2))之前,您需要return。如果您沒有明確return,該功能將返回None

這將解決此問題,但有一種方法可以使代碼更簡單:您實際上不需要成員length。相反,你可以加1,遞歸調用的結果:

def iterated(n): 
    if n==1: 
     return 1 
    elif n%2==0: 
     return 1 + iterated(n/2) 
    else: 
     return 1 + iterated(3*n+1) 

print(iterated(5)) 

這並不需要在一類,因爲沒有必要對任何成員。

3

你缺少return語句:

class iterate(): 
    def init(self): 
     self.length=1 
    def iterated(self, n): 
     if n==1: 
      return self.length 
     elif n%2==0: 
      self.length+=1 
      **return** self.iterated(n/2) 
     elif n!=1: 
      self.length+=1 
      **return** self.iterated(3*n+1) 
+0

啊...... grr非常感謝,很令人沮喪 – jakecar 2010-06-01 00:31:59

1

你只從遞歸的最深層次的返回值,則忽略它的第二最深層次。

所有self.iterated(...)線應該讀return self.iterated(...)

1

你要完成每個elif的分支return self.iterated(...)而不是我很好奇,你使用的是什麼版本的Python只是self.iterated(...)