-1

目前,我已经编写了一个递归函数来执行 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

我在这里做错了什么?

4

4 回答 4

2

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

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
于 2022-02-17T05:34:54.530 回答
1

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

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
于 2022-02-17T11:27:37.650 回答
1

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

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

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

5/2 = 2.5    =>  5//2 = 2
-5/2 = -2.5  =>  -5//2 = -3
6/3 = 2.0    =>  6//3 = 2
于 2022-02-17T05:43:43.920 回答
0

尝试将您的值转换为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)) 
于 2022-02-17T05:37:45.963 回答