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 では、ゼロで始まる整数リテラルは8 進数です。

あなたの例を挙げるには:

In [46]: 012
Out[46]: 10

In [47]: 0123
Out[47]: 83

In [48]: 0010
Out[48]: 8

関数は基数 10 で動作するため、正しく機能しています。:)

余談ですが、この問題には文字列操作も再帰も必要ありません。他の人がすでに非再帰的な解決策を提案しているので、文字列操作を使用しない再帰的な解決策を次に示します。

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)))

これは、上で賢明に指摘された 8 進文字列の問題を処理しないことに注意してください。

于 2012-12-04T19:59:40.470 に答える
0

数値統計0は 8 進数として扱われます。

の 8 進値00010は 8 です。

詳細については、投稿の2 進数を参照してください。.

で始まる Python 番号は機能し0ません。Oo8 進数の場合は、8 進数として変換するように指定する必要があります。

于 2012-12-04T20:15:36.297 に答える