添加循环到"数字根" Python3中的函数

时间:2017-01-28 21:10:58

标签: python python-3.x loops

我一直试图在CodeWars上遇到问题,而且我有点卡住了。我们的目标是创建一个" digital_root" function,在一起添加整数的数字。 (例如-17 = 7 + 1 - > 8)到目前为止,这是什么工作:

def digital_root(n):
    return sum([int(n) for n in str(n)])

但是,只有在n首次添加数字小于10时才有效。例如,当我想要8时,89会给我17;我知道它需要循环,无论它是否递归,但我无法弄明白。我最好的尝试是这样的:

def digital_root(n):
    sum = sum([int(n) for n in str(n)])
    if sum >= 10:
       digital_root(sum)

但我从第2行得到UnboundLocalError,而且我没有TypeError就无法解决这个问题。 ('int' object is not callable)这是While Loop的另一个示例,但还有更多TypeError s:

def digital_root(n):
    while sum([int(n) for n in str(n)]) >= 10:
        continue

3 个答案:

答案 0 :(得分:2)

您的第一次尝试非常接近,但在您递归致电digital_root(sum)时,您不会对结果做任何事情。另外,如评论中所述,请勿使用sum作为变量名称。

请改为尝试:

def digital_root(n):
    s = sum([int(n) for n in str(n)])
    if s >= 10:
        return digital_root(s)
    else:
        return s

或只使用一个return语句,而是更新变量:

def digital_root(n):
    s = sum([int(n) for n in str(n)])
    if s >= 10:
        s = digital_root(s)
    return s

或更短,使用三元表达式:

def digital_root(n):
    s = sum([int(n) for n in str(n)])
    return digital_root(s) if s >= 10 else s

答案 1 :(得分:1)

如果您将while的结果分配回循环体中的变量,并且还向函数添加了sum()语句,则return循环将起作用:

def digital_root(n):
    while n >= 10:
        n = sum([int(n) for n in str(n)])
    return n   

print(digital_root(89))  # 8

这里不需要使用递归,除非你也使用memoization。

答案 2 :(得分:1)

请勿使用sum作为变量,因为您会覆盖函数sum()。你必须使用return

def digital_root(n):
    result = sum([int(x) for x in str(n)])

    if result >= 10:
       return digital_root(result)
    else:
       return result 

print(digital_root(89))

while中,您必须将sum分配给变量,以便再次使用

def digital_root(n):

    while n >= 10:
        n = sum([int(x) for x in str(n)])

    return n

print(digital_root(89))