在 Python 中添加数字的递归函数在前导数字为零时失败



我正在尝试创建一个递归函数,将所有数字相加。这是我想出的:

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才能将其转换为八进制数。

最新更新