![](/img/trans.png)
[英]Finding sum of digits of a number until sum becomes single digit in python
[英]how to find the sum of digits of sum of digits of each of T numbers repeatedly in python till it gets to being a single digit number?
這是我編寫的代碼,用於從重復的次數中獲取數字總和,直到總和低於10:
T = int(input())
for i in range(T):
N = int(input())
def P():
M = [int(d) for d in str(N)]
N = sum(M)
if N<10:
print(N)
else :
return P()
P()
在運行此代碼時,它給我一個錯誤,例如:
Traceback (most recent call last):
File"C:/Users/AdityaShrivastava/AppData/Roaming/Python/Python36/Scripts/tes
ting.py", line 11, in <module>
P()
File "C:/Users/Aditya
Shrivastava/AppData/Roaming/Python/Python36/Scripts/testing.py", line 5, in
P
M = [int(d) for d in str(N)]
UnboundLocalError: local variable 'N' referenced before assignment
python中的函數聲明了新的作用域,這就是為什么N
在函數中不可見的原因。 您可以通過將N
傳遞到內部范圍來避免這種情況,如下所示:
T = int(input())
for i in range(T):
N = int(input())
def P(N):
M = [int(d) for d in str(N)]
N = sum(M) # this line was the actual culprit
if N<10:
print(N)
else :
return P(N)
P(N)
>>> 1 # test one time
>>> 12345 # cross total of 121212
6
Python在寫操作上比較保守。 僅從外部作用域變量讀取是可以的,但是重新分配名稱N
(如果您寫N = sum(M)
會發生這種情況)使它嚴格檢查該名稱的局部變量。
因此,它進一步假設尚未聲明的變量是您要從其上方的行中讀取的位置-坦率地說,這有點誤導。
有關python中作用域和名稱空間的更多信息,請參見此處 。
UnboundLocalError: local variable 'N' referenced before assignment
是由於在函數P()
中使用N而不聲明和初始化它的結果。
N = int(input())
在循環內,但不在P()
的范圍內。 循環中的最后一行P()
將調用函數P()
而不會返回到N = int(input())
,其中N將被分配。
我已將代碼修改為
T = int(input())
for i in range(T):
N = int(input())
def P(N):
M = [int(d) for d in str(N)]
N = sum(M)
if N<10:
print(N)
else :
return P(N)
P(N)
您可以通過在P函數中將N作為參數傳遞來解決此問題。
T = int(input())
for i in range(T):
N = int(input())
def P(n):
M = [int(d) for d in str(n)]
n = sum(M)
if n<10:
print(n)
else :
P(n)
P(N)
如果您在函數P中設置N的值,python會將其理解為使用該名稱創建一個局部變量。 該局部變量掩蓋了在函數外部使用的全局變量N。 因此,最好將N作為參數傳遞給函數P。
謝謝。
您正在使用遞歸來解決此問題。 簡單地使用循環會更有效:
def gimmeNumber(text):
""""Helper: Asks for input until valid integer number is inputted. Retuns the number"""
while True:
T = input(text).strip()
if T and T.isdigit():
T = int(T)
break
print("Thats not a number ...")
return T
def sumDigits(number):
return sum(int(x) for x in str(number))
T = gimmeNumber("How many numbers? ")
for _ in range(T):
s = 0
N = gimmeNumber("Give me a number: ")
# calculate the cross-sum
s = sumDigits(N)
while s > 9: # repeat while greater then 9
s = sumDigits(s)
print(s)
輸入:4,然后999,888,333,111
輸出:
9
6
9
3
正如@Arne建議將gimmeNumber(text)
更改為使用try/except
,它更適合於gimmeNumber(text)
要求寬恕而不是許可的心態,我同意。
盡管如此,上述變體仍然有效,並且對於初學者來說更容易理解。 這是try/except
:
def gimmeNumber(text):
""""Helper: Asks for input until valid integer number is inputted. Retuns the number"""
while True:
try:
T = int(input(text).strip())
break
except ValueError as e:
print("Thats not a number ...")
return T
有關輸入驗證的更多信息,建議在要求用戶輸入直到他們給出有效響應之前的答案中仔細閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.