2017-05-27 91 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