簡體   English   中英

我如何遞歸地為大數做 sum_of_digits

[英]How do I do sum_of_digits recursively for large numbers

目前,我已經編寫了一個遞歸的 function 來執行 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

我在這里做錯了什么?

您需要使用// ,即 integer 除法,而不是/ (浮點除法)。 使用/會失去精度,從而導致您遇到錯誤。

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

您應該在第 5 行使用“整數除法(運算符//)”而不是普通除法(運算符/)。

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

Integer除法返回不大於正常除法結果的最大integer。 例如,

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

有很多解決方案,但如果您對除法和取模 (%) 不滿意,可以使用此方法。 只需將數字作為字符串傳遞給 function。

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

嘗試將您的值轉換為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)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM