2017-05-27 215 views
1

我想在Python中使用遞歸實現一個方法,但由於某種原因無法讓它工作。當我輸入以下代碼時,出現「未定義變量」addDigits'(未定義變量)「的錯誤。我究竟做錯了什麼?與Python遞歸

def addDigits(self, num): 
    if len(str(num)) == 1: 
     return num 
    else: 
     return (addDigits((num - num % 10)/10) + num % 10) 
+0

這是班級嗎?嘗試'返回(self.addDigits ...' –

+0

@NickA我期望這樣給第一個參數 – Carcigenicate

+0

@Carcigenicate哈哈是的,這是一種修辭 –

回答

4

self告訴我這是一個類的實例方法。你需要通過self調用它像這樣:

def addDigits(self, num): 
    if len(str(num)) == 1: 
     return num 
    else: 
     return (self.addDigits((num - num % 10)/10) + num % 10) 

由於它沒有使用這個類的任何實例變量,它也適合被拉出,並在腳本級別放,或留在班上擔任一個靜態方法:

# you could leave it in the class and add the @stacticmethod decorator 
class Klass: 
    @staticmethod 
    def addDigits(num): 
     if len(str(num)) == 1: 
      return num 
     else: 
      return (addDigits((num - num % 10)/10) + num % 10) 

我假設你正在做這個只是爲了好玩,但如果你真的想實現這一點,這裏是一個更Python的一行代碼:

num = 1984 
print(sum(int(c) for c in str(num))) 
1

如果日方法是類的實例方法,那麼你應該嘗試在return語句中添加self,如上面的答案。 但是,如果它不是一個類的方法,只是這樣做:

def addDigits(num): 
    if len(str(num)) == 1: 
     return num 
    else: 
     return (addDigits((num - num % 10)/10) + num % 10) 

這將工作

0

只需使用self.addDigits,而不是隻是addDigits

1

注意,最大遞歸深度是相當默認情況下很小(在我的盒子上,python 2.17上的1k)。這可以通過運行檢查:

import sys 
print(sys.getrecursionlimit()) 

在大多數情況下(避免碰到遞歸限制),可以使你的代碼重複,這裏是很好的文章關於recursion-to-iteration。無論如何,如果你的代碼段確實是一個實例方法,就像'self'可以提示的那樣,你可以簡單地添加一個包含當前值的實例屬性。例如:

class UselessObject(object): 

    def __init__(self, start_value=0): 
     self.value = start_value 

    @staticmethod 
    def is_numeric(s): 
     try: 
      float(s) 
      return True 
     except (ValueError, TypeError): 
      return False 

    def addDigit(self, number): 
     assert self.is_numeric(number), "non-numeric value provided" 
     if str(number).__len__() == 1: 
      self.value += number 
     else: 
      self.value += (number - number%10)/10 + number%10 
+0

+1對於一般遞歸的東西('''getrecursionlimit'''和文章)。但是你可能想要修復代碼,它現在缺少遞歸部分。 – tevemadar