二分搜索导致无限循环

时间:2016-07-07 11:22:24

标签: python

我想使用二分搜索来了解每月付款应该是多少,以便在用户输入的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

1 个答案:

答案 0 :(得分:0)

我已将上述问题重新编码为

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))