该代码应用于查找整数的总和。当我运行它时,计算机只处理了一段时间,然后什么也没发生
def sum_of_digits(integer):
numlist = list(str(integer))
if len(numlist) == 0:
result = 0
elif len(numlist) == 1:
result = numlist[0]
else:
midPoint = len(numlist) // 2
result = sum_of_digits(numlist[:midPoint]) +
sum_of_digits(numlist[midPoint:])
print(result)
return result
sum_of_digits(123456)
答案 0 :(得分:1)
此答案不会不将数字转换为字符串(或其他可迭代的数字),然后再转换回数字。
def sum_of_digits (n: int, sum = 0) -> int:
if n < 10:
return n + sum
else:
return sum_of_digits (n // 10, sum + n % 10)
print(sum_of_digits(1)) # 1
print(sum_of_digits(12)) # 3
print(sum_of_digits(123)) # 6
print(sum_of_digits(1234)) # 10
print(sum_of_digits(12345)) # 15
答案 1 :(得分:1)
另一种无需数据类型转换的简单解决方案:
def sum_of_digits(integer):
if integer == 0:
return 0
else:
return integer % 10 + sum_of_digits(integer // 10)
答案 2 :(得分:0)
您已经使数据类型非常混乱。命名integer
并不会使它成为整数。第一次通话就可以了。完成任何基本调试之后,您就会看到问题所在:将整数转换为单字符字符串列表。
拆分列表并重复使用时,您会将半列表作为integer
传递到函数中。当您立即使用str(integer)
将其转换为新字符串时,将得到类似于"['1']"
的字符串,而不是简单的字符数字。当您将那个分解成一个列表时,您将['[', "'", '1', ']', "'"]
称为numlist
... ...从那里是一个讨厌的无限递归。
首先,请确保您的函数具有一致的接口:如果没有其他问题,请将半字符串重新构造为整数并将该值提供给递归调用。其次,不要过于膨胀:您可以简单地将整数转换为字符串并处理各个数字;无需为此列出清单。 第三,请访问这个可爱的debug博客以寻求帮助。
最后,您可以在线研究其他解决方案。这是一个常见的练习。我不是要告诉您复制程序-但是,既然您已对问题进行了很好的尝试,则可以从其他人那里了解内部处理。
为了让您动起来,这是我如何调试代码:print
进入和退出时有用的东西,并延迟(睡眠),因此我有机会在有用的信息发布之前中断程序离开屏幕。
from time import sleep
call = 0
def sum_of_digits(integer):
global call
call += 1
id = call
print("ENTER", call, integer)
numlist = list(str(integer))
print("numlist", numlist)
sleep(1)
if len(numlist) == 0:
result = 0
elif len(numlist) == 1:
result = numlist[0]
else:
midPoint = len(numlist) // 2
result = sum_of_digits(numlist[:midPoint]) + \
sum_of_digits(numlist[midPoint:])
print("LEAVE", id, result)
return result
test = [0, 1, 12]
for case in test:
call = 0
sum_of_digits(case)
print("-------------------------")
输出:
ENTER 1 0
numlist ['0']
LEAVE 1 0
-------------------------
ENTER 1 1
numlist ['1']
LEAVE 1 1
-------------------------
ENTER 1 12
numlist ['1', '2']
ENTER 2 ['1']
numlist ['[', "'", '1', "'", ']']
ENTER 3 ['[', "'"]
numlist ['[', "'", '[', "'", ',', ' ', '"', "'", '"', ']']
ENTER 4 ['[', "'", '[', "'", ',']
numlist ['[', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ']']
^CTraceback (most recent call last):
File "so.py", line 33, in <module>
sum_of_digits(case)
File "so.py", line 23, in sum_of_digits
result = sum_of_digits(numlist[:midPoint]) + \
File "so.py", line 23, in sum_of_digits
result = sum_of_digits(numlist[:midPoint]) + \
File "so.py", line 23, in sum_of_digits
result = sum_of_digits(numlist[:midPoint]) + \
File "so.py", line 15, in sum_of_digits
sleep(1)
KeyboardInterrupt
答案 3 :(得分:0)
您正在内部调用自己的函数。同样,在调用它时,您会给它一个列表而不是整数,从而导致它遍历列表而不是所需的数字。您可能想使用''.join
返回一个整数而不是一个列表。
sum_of_digits(int(''.join(numlist[:midPoint]))))
即使执行此操作,您的函数仍需要做更多的工作,并且您可能想使用int()
声明来确保使用整数。
另外,您可以使用使用for循环的东西,该循环可以更有效地实现目标,但可能不是您想要的。
def sum_of_digits(integer):
ans=0
for i in str(integer):
ans+=int(i)
return ans
答案 4 :(得分:0)
即使“什么也没有发生”并不能提供太多信息,但您显然是在以一种非常混乱的方式混合数据类型。
您的sum_of_digits
函数使用一个整数作为参数,调用它integer
并不能使它成为一个整数,仍然需要确保使用正确的参数调用它。
当您使用sum_of_digits(numlist[:midPoint])
和sum_of_digits(numlist[midPoint:])
递归调用它时,您传递的不是整数,这是问题所在,请继续进行处理。