我寫了一個代碼來解決以下演算法問題:
給定多個大于 1 的正整數,找出總和為素數的最大對數。正整數的個數總是偶數。例如,給定 2 5 6 13 2 11,答案是 3,因為 2 5=7, 6 13=19, 2 11=13。
我寫了下面的代碼來解決這個問題。我知道這不是最佳演算法,但我只是找不到導致我在測驗用例中失敗的錯誤。
def _isPrime(num):
for i in range(2, int(num**0.5) 1):
if num % i==0:
return False
return True
def findPairs(odds, evens, pairDict):
if len(odds)==0 or len(evens)==0:
return 0
key=' '.join(list(map(str, odds evens)))
if key in pairDict:
return pairDict[key]
n=0
for i in range(len(evens)):
newOdds=odds.copy()
newEvens=evens.copy()
del newOdds[0]
del newEvens[i]
if _isPrime(odds[0] evens[i]):
n=max(n,findPairs(newOdds, newEvens, pairDict) 1)
else:
n=max(n,findPairs(newOdds, newEvens,pairDict))
pairDict[key]=n
return n
numbers=list(map(int,input().split()))
odds=[i for i in numbers if i%2==1]
evens=[j for j in numbers if j%2==0]
pairDict={}
print(findPairs(odds,evens,pairDict))
有人可以幫我找出問題所在。非常感謝!
uj5u.com熱心網友回復:
問題是遞回總是試圖將第一個奇數與某個偶數匹配。如果偶數少于奇數,這可能會出錯,因為它會用完本來可以用于以后匹配的偶數。
例如,考慮“13 2 3”。此代碼將回傳 0,但 2 3 是素數。
您可以通過允許額外的遞回情況來解決它,其中第一個奇數被丟棄而不減少偶數串列。
del newOdds[0]
n=max(n,findPairs(newOdds, newEvens, pairDict)) # added line
del newEvens[i]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505892.html