我寫了這段代碼,正數沒問題,但是當我嘗試負數時,它崩潰了。您能否就如何使其與負數一起作業提供任何提示?另外,我需要它與recursion. 該函式需要計算一個整數的位數之和。
def sum_digits(n):
if n != 0:
return (n % 10 sum_digits(n // 10))
else:
return 0
if __name__=='__main__':
print(sum_digits(123))
Input: 123
Output: 6
uj5u.com熱心網友回復:
假設負數的三位數字的“總和”與該數字的絕對值的“總和”相同,這將起作用:
def sum_digits(n):
if n < 0:
return sum_digits(-n)
elif n != 0:
return (n % 10 sum_digits(n // 10))
else:
return 0
也就是說,您在這里的實際問題是 Python 對負數取模的處理與您預期的不同:
>>> -123 % 10
7
這是為什么?這是因為trunc()在磁區中使用了。這個頁面有一個很好的解釋,但簡短的回答是,當你將 -123 除以 10 時,為了計算余數,Python 會以與你預期不同的方向截斷。(為好,如果晦澀,原因)。因此,在上面的,而不是得到預期的3你7(這是10,你的模量,再減去3,剩下的)。
同樣,它對整數除法的處理也不同:
>>> -123 // 10
-13
>>> 123 // 10
12
這是不直觀的正確,因為它是“向下”而不是“向零”四舍五入。所以 a-12.3舍入“向下”到-13.
這些原因就是為什么解決您的特定問題的最簡單方法是在進行實際計算之前簡單地取絕對值。
uj5u.com熱心網友回復:
將您的函式分為兩個函式:一個是必須始終使用非負數呼叫的遞回函式,另一個是檢查其引數的函式可以使用適當的引數呼叫遞回函式。
def sum_digits(n):
return _recursive_sum_digits(abs(n))
def _recursive_sum_digits(n):
if n != 0:
return (n % 10 sum_digits(n // 10))
else:
return 0
由于_recursive_sum_digitscan 假設它的引數是非負的,你可以不用在每次遞回呼叫時檢查它的符號,并保證n // 10最終會產生 0。
uj5u.com熱心網友回復:
如果您只想對負號后面的數字求和,請通過取數字的絕對值來洗掉符號。如果您認為負數的第一個數字是負數,則在對其余數字執行此功能后手動添加該數字。
uj5u.com熱心網友回復:
這是你的提示。發生這種情況是因為模運算子總是產生與第二個運算元(或零)具有相同符號的結果。看看這些例子:
>>> 13 % 10
3
>>> -13 % 10
7
在您的具體情況下,解決方案是首先獲得數字的絕對值,然后您可以繼續使用您的方法:
def sum_digits(n):
n = abs(n)
if n != 0:
return (n % 10 sum_digits(n // 10))
else:
return 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370733.html
