2

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

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

我在这里想念什么?

4

3 回答 3

12

在 Python 2 中,以零开头的整数文字是octal

举个例子:

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
于 2012-12-04T19:55:32.047 回答
2

老实说,有一个更简单的方法来完成这件事。

sum(map(int, str(num)))

请注意,这并没有解决上面明智地指出的八进制字符串问题。

于 2012-12-04T19:59:40.470 回答
0

Numbers stats0被视为八进制数。

八进制00010值为 8 。

有关更多信息,请参阅帖子二进制数?.

以 开头的 Python 数字0将不起作用。对于八进制数,您必须指定Oo将其转换为八进制数。

于 2012-12-04T20:15:36.297 回答