我想在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哈哈是的,這是一種修辭 –