2012-10-15 67 views
0

我遇到了一個來自在線課程(Python入門)的問題。基本上,我們被告知要使用二分法搜索來查找每月最低的固定支付額,以在給定餘額和年利率時在一年內清除債務(四捨五入到最接近的0.01美元)。我的解決方案在上傳到他們的在線平地機時,僅給出了此錯誤:Python中的二進制搜索無限循環?

「運行您的解決方案時出現問題。 我們無法運行您的解決方案。

我可能在一個無限循環?如果是這樣,我不太明白如何。原始代碼在下面發佈。謝謝大家花時間閱讀本文!

MonthlyInterestRate = annualInterestRate/12 
month = 1 
LB = balance/12 
UB = balance*(2.7/12) 
check = balance 
while abs(balance) > 10: 
    payment = (LB + UB)/2 
    while month <= 12: 
     balance = (balance - payment)*(1 + MonthlyInterestRate) 
     month = month + 1 
    if balance > 10: 
     LB = payment 
     balance = check 
    elif balance < -10: 
     UB = payment 
     balance = check 
    else: 
     print('Lowest Payment: ' + str(payment)) 
     break 
+4

這是完整的代碼嗎?您還沒有在任何地方定義'annualInterestRate'或'balance'。 –

+2

服務器不會給你完整的回溯?當您在計算機上本地運行時會遇到什麼錯誤? –

+0

1.在線平地機上嘗試「hello world」示例,以確保正確處理輸入/輸出。 2.在你的機器上本地測試你的解決方案。 3.將利率邏輯封裝在單獨的對象中(分別測試二分查找和餘額計算,例如,如果有[複合](http://en.wikipedia.org/),'MonthlyInterestRate = annualInterestRate/12'是錯誤的/ wiki/Compound_interest))4.使用整數或decimal.Decimal進行貨幣算術運算。 – jfs

回答

2

看來,可能的罪魁禍首是,你永遠不會重置內部while循環後的月份的值。也就是說,一旦內部執行一次,它將永遠不會再執行。這意味着平衡的價值不會改變,你將陷入無限循環。

既然你只使用一個月迭代的次數後,你應該真正改變內部循環來

for m in range(month): 
    balance = (balance - payment)*(1 + MonthlyInterestRate) 

編輯:

從頭開始的,只是你的函數玩弄似乎如果起始餘額大於13,那麼它很快收斂到一些。如果餘額小於10,那麼你的函數減少餘額,所以它肯定不會終止。如果餘額小於13,那麼它似乎終止於1次迭代。

我測試了不同年利率的函數,它對結果完全沒有影響。收斂數似乎約爲起始餘額的90%。這是一個borked功能。

+0

啊!多麼愚蠢的錯誤。非常感謝!!! –