我一直试图在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
答案 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))