0

在递归方面我是新手(和 python,请客气哈哈),所以我想尝试一下代码战问题(https://www.codewars.com/kata/541c8630095125aba6000c00/train/python

我只是对为什么忽略中断感到非常困惑,并且递归仍在继续。

def digital_root(n):
    x = list(str(n))
    z = 0
    while True:
        for i in range(0, len(x)):
            x[i] = int(x[i])
        for i in x:
            z = i + z
        if z < 10:
             break
        elif z >= 10:
            digital_root(z)
    return z

print(digital_root(942))
4

1 回答 1

2

在递归调用自身之后,它丢弃了返回值,所以zx保持不变。将递归调用更改为:

return digital_root(z)

这样递归就结束了。事实上,while循环不应该执行超过一次,所以你可以这样做:

def digital_root(n):
    x = list(str(n))
    z = 0
    for i in range(0, len(x)):
        x[i] = int(x[i])
    for i in x:
        z = i + z
    if z < 10:
        return z
    return digital_root(z)

或者,如果您想完全消除递归,您真正需要的只是以下内容(其中包括一些额外的简化):

def digital_root(n):
    while n >= 10:
        n = sum(int(d) for d in str(n))
    return n
于 2020-09-15T02:23:40.493 回答