我的Python代码中包含递归函数,有什么问题?

5

我正在使用递归来寻找一个快乐数

以下是我的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)

结果如下:
7 True
1 True
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 True

当我单独测试数字7时,它返回“True”。但是当我运行最后两行代码时,数字7返回“False”。
我不知道哪个部分有问题。
几分钟后,我在我的Python代码中找到了错误部分。 然后我添加了:
deepth = 0

之后:

if deepth > 800:

在@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,

3
一个猜测:global deepth 变量可能与此有关(顺便说一下,“deepth”应该拼成“depth”)。 - barak manos
3个回答

8
您没有成功重置全局变量depth。更好的处理方法是将深度传递给递归调用。

可以采用以下方式:

def is_happy_number(number, depth=0):
    # ... as before ...
    return is_happy_number(sum_digit, depth)

非常感谢。我应该向您学习。我通过您的提醒解决了它。 - zero
1
没问题。很高兴能帮助到你。 - Will

6

正如Barak Manos在他的答案中指出的那样,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)

我完全同意Will的观点,你不应该使用全局变量。


0
问题出在您只定义了一次 deepth,然后重复使用了它的先前值。要解决这个问题,您必须在返回 False 或 True 时将 deepth 设置为 0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接