2014-09-10 44 views
0

我一直在堅持這個問題好幾個小時,而且我一直在重做它!在這一點上,我想我實際上看到了數字在我周圍飛行。Python中的二等分搜索 - 在一年內查找最低付款額

無論如何,我應該寫一個程序,找到每月支付一年的正確金額,以償還信用卡上的債務。因此,通過這個計劃,必須滿足一些條件。

  • 它必須通過使用二分法搜索((低+高)/ 2)
  • 有一組平衡
  • 有年利率來完成。

這是我現在的代碼,我得到的所有東西都是無限循環。我在這裏做錯了什麼?

balance = 320000 
annualInterestRate = 0.2 

monthly_interest = float(annualInterestRate)/12.0 
lower_bound = float(balance/12) 
upper_bound = (balance * (1 + monthly_interest)**12)/12.0 
epsilon = 0.01 
ans = float(lower_bound + upper_bound)/2 

while abs((balance * (1 + monthly_interest)**12)/12.0) >= epsilon: 

    ans = float(lower_bound + upper_bound)/2 
    total = float(ans * 12) 
    new_balance = 0 
    interest = 0 

    for month in range(0, 12): 
     interest += ans + (1 + monthly_interest) 
     new_balance += ans + interest 

    if new_balance > balance: 
     upper_bound = ans 
     print "low" + str(new_balance) 
    elif new_balance < balance: 
     lower_bound = ans 
     print "high" + str(new_balance) 
    else: 
     print "What's going on here?" 

print "Lowest payment: %r" % ans 
+0

當pset正在進行時,您不應該發佈來自MIT6.00.1x的代碼,這個想法是自己弄清楚問題或者它破壞了目的 – 2014-09-10 19:40:16

回答

1

我相信,有幾件事情錯在這裏,先這樣第一件事情,你雖然是一個無限循環,因爲你正在使用的條件絕不會收斂到解(變量值永遠不會在循環內改變) 。除此之外,這種情況似乎是錯誤的。

這是我認爲你正在嘗試做的事情,你試圖找到「每月支付」的上限和下限,並且收斂條件是這些邊界之間的差異應該小於常數epsilon(換句話說,錯誤應該小於epsilon)。

在你的循環內,你正在計算正確的中點,這個中點已經考慮到了興趣,但正在計算它。改變上限和下限的條件沒有考慮到利益,所以這部分代碼有點雜亂。

因此,修改這些條件,你的程序實際上收斂於一個解決方案:

balance = 320000 
annualInterestRate = 0.2 

monthly_interest = float(annualInterestRate)/12.0 
lower_bound = float(balance/12) 
upper_bound = (balance * (2 + monthly_interest)**12)/12.0 
epsilon = 0.001 
ans = float(lower_bound + upper_bound)/2 
total_debt=balance * (1 + annualInterestRate) 
print total_debt 
while (upper_bound - lower_bound) >= epsilon: 

    ans = float(lower_bound + upper_bound)/2 
    total = float(ans * 12) 

    if total > total_debt: 
     upper_bound = ans 
     print "low " + str(total) 
    elif total < total_debt: 
     lower_bound = ans 
     print "high " + str(total) 
    else: 
     print "Solution found" 
    break 


print "Lowest payment: %r" % ans 

希望它能幫助!

+0

看起來您正在計算'total_debt'而不是考慮每月將用於不斷變化的餘額的金額。 – 2016-11-26 19:25:01