我正在使用递归来找到一个快乐的数字.
以下是我的Python代码:
deepth = 0
def is_happy_number(number):
astring = str(number)
global deepth
digits = [int(char) for char in astring]
sum_digit = sum([digit**2 for digit in digits])
if sum_digit == 1:
deepth = 0
return True
else:
deepth += 1
if deepth >800:
return False
return is_happy_number(sum_digit)
print '7',is_happy_number(7)
for number in range(1,11):
print number,is_happy_number(number)
Run Code Online (Sandbox Code Playgroud)
结果是:
7 True
1 True
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 True
Run Code Online (Sandbox Code Playgroud)
当我单独测试7号时,它返回'True'.当我运行最后两个原始代码时,数字7返回'False'.
我不知道哪个部分是错的.
几分钟后,我在Python代码中找到了错误的部分.我补充说:
deepth = 0
Run Code Online (Sandbox Code Playgroud)
后:
if deepth > 800:
Run Code Online (Sandbox Code Playgroud)
随着@Will的提醒,我找到了另一个解决这个问题的方法.修改代码如下:
def is_happy_number(number, deepth=0):
astring = str(number)
digits = [int(char) for char in astring]
sum_digit = sum([digit**2 for digit in digits])
if sum_digit == 1:
return True
else:
deepth += 1
if deepth >800:
return False
return is_happy_number(sum_digit,deepth)
print '7',is_happy_number(7,0)
for number in range(1,10):
if is_happy_number(number,0):
print number,
Run Code Online (Sandbox Code Playgroud)
您无法重置全局变量depth.处理此问题的更好方法是将深度传递给递归调用.
像这样的东西:
def is_happy_number(number, depth=0):
# ... as before ...
return is_happy_number(sum_digit, depth)
Run Code Online (Sandbox Code Playgroud)
正如巴拉克马诺斯在他的回答中指出的那样,deepth变量就是罪魁祸首.在达到深度800的情况下不会重置.如果这样做,您的代码将起作用:
deepth = 0
def is_happy_number(number):
astring = str(number)
global deepth
digits = [int(char) for char in astring]
sum_digit = sum([digit**2 for digit in digits])
if sum_digit == 1:
deepth = 0
return True
else:
deepth += 1
if deepth >800:
deepth = 0
return False
return is_happy_number(sum_digit)
print '7',is_happy_number(7)
for number in range(1,11):
print number,is_happy_number(number)
Run Code Online (Sandbox Code Playgroud)
我完全同意威尔你不应该使用全局变量.