我剛開始使用遞回函式,我必須創建一個函式來接收整數并回傳一個僅包含偶數位的新數字。例如,如果它收到23456,它應該回傳246。這是我嘗試過的:
def newInt(n):
dig = n % 10
if dig % 2 == 1:
return newInt(n//10)
elif dig % 2 == 0:
return str(n) newInt(n//10)
print(newInt(32))
但我收到以下錯誤:
RecursionError: maximum recursion depth exceeded in __instancecheck__
關于我應該怎么做來修復它的任何提示?
uj5u.com熱心網友回復:
你需要一個基本案例。也不需要將任何整數轉換為字串。newInt()這是解決這兩個問題的作業版本:
def newInt(n):
if not n:
return 0
dig = n % 10
if dig % 2 == 1:
return newInt(n // 10)
else:
return 10 * newInt(n // 10) dig
uj5u.com熱心網友回復:
您的問題是您沒有條件停止遞回 - 每次呼叫都會newInt導致另一個呼叫。停止的一種方法是檢查是否n小于 10,n如果是偶數則回傳。例如:
def newInt(n):
if n < 10:
return n if n % 2 == 0 else 0
dig = n % 10
if dig % 2 == 1:
return newInt(n//10)
elif dig % 2 == 0:
return newInt(n//10) * 10 dig
注意我已經修改了你的函式以回傳一個整數而不是一個字串。
uj5u.com熱心網友回復:
這是一個變體divmod。取消注釋列印以查看它是如何作業的:
def newInt(n):
d,r = divmod(n,10)
# print(n,d,r)
if d == 0:
return 0 if r%2 else r
if r % 2:
return newInt(d)
else:
return 10*newInt(d) r
print(newInt(212033450))
輸出:22040
uj5u.com熱心網友回復:
你甚至不需要為每個回圈打破 dig :
def newInt(n):
if n:
if n & 1:
return newInt(n // 10)
else:
return 10 * newInt(n // 10) (n % 10)
return 0
uj5u.com熱心網友回復:
match..case這是使用 Python 3.10語法重寫的 @mozway 演算法-
def newInt(n):
match divmod(n, 10):
case (0, r) if r & 1:
return 0
case (0, r):
return r
case (d, r) if r & 1:
return newInt(d)
case (d, r):
return 10 * newInt(d) r
print(newInt(67120593306737201))
6200620
Noter & 1對于測驗一個數字是偶數還是奇數更有效。r % 2執行除法,而&只檢查第一位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482925.html
下一篇:根據子條件過濾嵌套的物件陣列
