平分搜索导致无限循环

平分搜索导致无限循环

问题描述:

我想使用平分搜索来找出多少月付款应该是为了支付用户将输入的12个月内的全部余额。但是,我写的这段代码进入了无限循环,显示出“低,高,montlyPayment无限次”。我不知道哪个代码导致这个问题,因为条件语句对我来说似乎是正确的。平分搜索导致无限循环

initialBalance = float(raw_input('Enter the outstanding balance on your   credit card')) 
annualInterestrate = float(raw_input('Enter the annual credit card interest rate as a decimal')) 
monthlyInterestrate = round(annualInterestrate, 2) 

balance = initialBalance 
while balance > 0: 
    numMonth = 0 
    balance = initialBalance 
    low = balance/12.0 
    high = (balance*(1+(annualInterestrate/12.0))**12.0)/12.0 
    epsilon = 0.01 
    monthlyPayment = round((high + low)/2.0, 2) 
    while abs(monthlyPayment*12.0 - initialBalance) >= epsilon: 
     print 'low =', low, 'high =', high, 'monthlyPayment =', round(monthlyPayment,2) 
     if monthlyPayment*12.0 < balance: 
      low = monthlyPayment 
     else: 
      high = monthlyPayment 
     monthlyPayment = round((high + low)/2.0, 2) 
     while balance > 0 and numMonth < 12: 
      numMonth += 1 
      interest = monthlyInterestrate * balance 
      balance -= monthlyPayment 
      balance += interest 
balance = round(balance, 2) 

print 'RESULT' 
print 'monthly payment to pay off debt in 1 year:', monthlyPayment 
print 'Number of months needed:', numMonth 
print 'Balance:',balance 
+0

下联:'余额= initialBalance'。是设计还是偶然? –

+1

我想知道通过反复试验找出一个近似结果的重点是什么,同时你可以逆转公式并立即得到确切的结果? – spectras

+0

余额= initialBalance是多余的,但我不认为这是造成这个问题的原因。这是我正在研究麻省理工学院开放课件的一个问题集,它指定了对分搜索的使用。 –

我已经重新编码的上述问题,因为在循环

balance = 120000 
annualInterestRate = 0.1 
rate=annualInterestRate/12.0 
high=(balance * (1 + rate)**12)/12.0 
low=balance/12.0 
payment=0 
bal_ref=balance 
unpaid=balance 
N=0 
while (abs(unpaid) > .01): 
    month=0 
    pay=(high+low)/2 
    balance=bal_ref 
    while(month < 12): 
     unpaid=balance-pay 
     balance=unpaid + (unpaid * rate) 
     month +=1 
    if (abs(unpaid) < .01): 
     payment=pay 
     break 
    elif (unpaid > .01): 
     low=pay 
    elif (unpaid < -.01): 
     high=pay 
    N+=1 
print("Payment:",round(pay,2)) 
+0

请解释一下,你改变了什么。 – Ray