我想在Python中使用递归实现一个方法,但由于某种原因无法让它工作。当我输入以下代码时,出现“未定义变量”addDigits'(未定义变量)“的错误。我究竟做错了什么?与Python递归
def addDigits(self, num):
if len(str(num)) == 1:
return num
else:
return (addDigits((num - num % 10)/10) + num % 10)
我想在Python中使用递归实现一个方法,但由于某种原因无法让它工作。当我输入以下代码时,出现“未定义变量”addDigits'(未定义变量)“的错误。我究竟做错了什么?与Python递归
def addDigits(self, num):
if len(str(num)) == 1:
return num
else:
return (addDigits((num - num % 10)/10) + num % 10)
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)))
如果日方法是类的实例方法,那么你应该尝试在return语句中添加self,如上面的答案。 但是,如果它不是一个类的方法,只是这样做:
def addDigits(num):
if len(str(num)) == 1:
return num
else:
return (addDigits((num - num % 10)/10) + num % 10)
这将工作
只需使用self.addDigits,而不是只是addDigits
注意,最大递归深度是相当默认情况下很小(在我的盒子上,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
+1对于一般递归的东西('''getrecursionlimit'''和文章)。但是你可能想要修复代码,它现在缺少递归部分。 – tevemadar
这是班级吗?尝试'返回(self.addDigits ...' –
@NickA我期望这样给第一个参数 – Carcigenicate
@Carcigenicate哈哈是的,这是一种修辞 –