我想使用遞回而不使用 max() 或 min() 函式來獲取串列中的最大奇數。
這就是我到目前為止所寫的:
def maxOdd(L):
if L[1:]:
#check odd numbers only
if L[0] % 2 == 1:
#get largest odd number
if L[0] > maxOdd(L[1:]):
return L[0]
else:
return maxOdd(L[1:])
else:
return maxOdd(L[1:])
#check if list is empty
elif not L:
return None
else:
return L[0]
但它不能很好地作業并且沒有通過這個測驗:
print('Testing maxOdd()...', end='')
assert(maxOdd([ ]) == None)
assert(maxOdd([ 2, 4, 6 ]) == None)
assert(maxOdd([ 2, 4, 6, 7 ]) == 7)
assert(maxOdd([ -1, -2, -3 ]) == -1)
assert(maxOdd([ 1,2,3,4,5,6,7,8,9,10,0,0,0,11,12 ]) == 11)
print('Passed!')
你能幫我嗎?我被困了幾個小時。謝謝!
uj5u.com熱心網友回復:
在回傳它之前,您應該首先確保第一項是奇數;否則,與您的:
if L[1:]:
...
else:
return L[0]
即使不是奇數,您也將回傳第一項。
一個作業示例:
def maxOdd(L):
if L:
first, *rest = L
max_rest = maxOdd(rest)
if first % 2 == 1 and (max_rest is None or first > max_rest):
return first
return max_rest
演示:https : //replit.com/@blhsing/DisguisedEveryNotification
uj5u.com熱心網友回復:
問題在于if L[0] > maxOdd(L[1:]):. 由于我們正在尋找最大奇數,我們只需要比較奇數。所以如果maxOdd(L[1:])不奇怪,我們需要忽略它。
def maxOdd(L):
if L[1:]:
if L[0] % 2 == 1:
x = maxOdd(L[1:])
#if x is odd, compare. if not rrturn L[0]
if x is not None and x%2==1:
if L[0] > x:
return L[0]
else:
return x
else:
return L[0]
else:
return maxOdd(L[1:])
elif not L:
return None
elif L[0]%2==1:
return L[0]
else:
return None
uj5u.com熱心網友回復:
我知道您要求一種運行遞回的方法,但也許這個非遞回解決方案也很有趣:
def max_odd(find_list):
return sorted([i for i in find_list if i%2==1])[-1]
print(max_odd([1,2,3,4,5,8,99,9,99,8,77,6,5,44,11]))
>99
IndexError如果串列中沒有奇數,代碼將引發一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344905.html
上一篇:做簡單的python遞回時的問題
下一篇:將迭代函式轉換為遞回函式
