如何对大数递归执行 sum_of_digits

How do I do sum_of_digits recursively for large numbers

目前,我已经编写了一个递归函数来执行 sum_of_digits 但它适用于较小的数字,例如小于 6.

但对于较大的数字,由于某种原因计算会出错。

def sum_of_digits(i):
    if i == 0 :
        return i
    else:
        return i % 10 + sum_of_digits(i / 10)

sum_of_digits(228475) 
# returns 31.111111111111107 
# should be returning 28 instead

我做错了什么?

您需要使用 // 整数除法,而不是 /(浮点除法)。使用 / 会失去精度,从而导致您遇到错误。

def sum_of_digits(i):
    if i == 0:
        return i
    return i % 10 + sum_of_digits(i // 10)

print(sum_of_digits(228475)) # 28

它可以通过以下方式完成:

print(sum(map(int, str(228475)))) # 28

尝试将您的值转换为 int 类型:

def sum_of_digits(i):
if i == 0 :
    return i
else:
    return i % 10 + sum_of_digits(int(i / 10))

print(sum_of_digits(228475)) 

您应该在第 5 行使用“整数除法(运算符//)”而不是正常的除法(运算符/)。

...
        return i % 10 + sum_of_digits(i // 10)
...

整数除法return不大于正常除法结果的最大整数。 例如,

5/2 = 2.5    =>  5//2 = 2
-5/2 = -2.5  =>  -5//2 = -3
6/3 = 2.0    =>  6//3 = 2

有很多解决方案,但如果您对除法和取模 (%) 不满意,可以使用此方法。只需将数字作为字符串传递给函数即可。

def sum_of_digits(num, ind=0):
    
    if ind == len(num):
        return 0
        
    return int(num[ind]) + sum_of_digits(num,ind+1)


sum_of_digits(str(228475))
#RESULT = 28