我正在尝试创建一个递归函数,将所有数字相加。这是我想出的:
def sumOfDigits(num):
num=str(num)
if len(num)==0:
return 0
elif len(num)==1:
return int(num)
elif len(num)>1:
return int(num[0]) + int(num[-1]) + int(sumOfDigits(num[1:-1]))
这似乎适用于几乎任何数字:
sumOfDigits(999999999)
>>>81
sumOfDigits(1234)
>>>10
sumOfDigits(111)
>>>3
sumOfDigits(1)
>>>1
sumOfDigits(0)
>>>0
如果数字以"0"开头,就会发生奇怪的事情
sumOfDigits(012)
>>>1
sumOfDigits(0123)
>>>11
sumOfDigits(00010)
>>>8
我在这里错过了什么??
在 Python 2 中,以零开头的整数文本是八进制的。
举个例子:
In [46]: 012
Out[46]: 10
In [47]: 0123
Out[47]: 83
In [48]: 0010
Out[48]: 8
由于您的函数以十进制工作,因此它正在正确执行其工作。 :)
顺便说一句,这个问题既不需要字符串操作,也不需要递归。由于其他人已经提出了非递归解决方案,因此这里有一个不使用字符串操作的递归解决方案:
def sumOfDigits(n):
return 0 if n == 0 else sumOfDigits(n // 10) + n % 10
老实说,有一种更简单的方法可以完成整个事情。
sum(map(int, str(num)))
请注意,这并不能解决上面明智地指出的八进制字符串问题。
带有0
的数字统计信息被视为八进制数。
00010
的八进制值为 8 。
有关更多信息,请参阅二进制数后? 。
以 0
开头的 Python 数字将不起作用。对于八进制数,您必须指定Oo
才能将其转换为八进制数。