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