这个二分搜索算法出了什么问题?

时间:2013-11-02 13:23:29

标签: python bisection

我已经完成了MITx CS课程的作业,我遇到了以下问题:

  

以下变量包含如下所述的值:

     

余额 - 信用卡上的未结余额

     

annualInterestRate - 年度利率小数

     

回顾一下问题:我们正在寻找最小的月度   付款,以便我们可以在一年内支付全部余额。   这个支付价值的合理下限是多少? $ 0是   明显的anwer,但你可以做得更好。如果没有   利息,债务可以通过每月支付十二分之一来偿还   原来的平衡,所以我们必须至少付出这么多   月。原始余额的十二分之一是一个很好的下限。

     

什么是好的上限?想象一下,我们不是每月支付   在年底偿还了全部余额。我们最终是什么   薪水必须大于我们每月支付的金额   分期付款,因为利息在我们的余额上复杂化了   每个月没有还清。所以月度上限很好   在获得利息之后,付款将是余额的十二分之一   每月复合一整年。

     

简而言之:

     

每月利率=(年利率)/ 12.0每月付款   下限=余额/ 12月支付上限=(余额x(1   +每月利率)12)/ 12.0

     

编写一个使用这些边界和二分搜索的程序(更多信息   信息查看维基百科页面上的二分搜索)找到   最低每月支付到分(不超过10美元的倍数)这样   我们可以在一年内偿还债务。尝试用大号   输入,并注意它是多快(尝试相同的大输入)   问题2的解决方案比较!)。产生与之相同的回报值   你在问题2中做过。

现在,这是我能够提出的,但实际上会产生错误的输出。我不知道这段代码出了什么问题:

#------------Defined variables---------------#
balance = 999999
annualInterestRate = 0.18
#------------Defined variables---------------#


monthlyInterestRate = annualInterestRate / 12.0
monthlyPaymentLower = balance / 12
monthlyPaymentUpper = (balance * (1 + monthlyInterestRate)**12) / 12.0
month = 1
total = 0

while (total < balance) and month < 13:
    pay = (monthlyPaymentLower + monthlyPaymentUpper) / 2
    total += pay
    if total < balance:
        monthlyPaymentLower = pay
    elif total > balance:
        monthlyPaymentHigher = pay
    month += 1
    if month == 13:
        total = 0
        month = 1
print 'Lowest Payment: ' + str(round(pay, 2))

帮助?

像往常一样,不寻找完整的解决方案或源代码,只需在我出错的地方留下一些提示。 (我总是得到负面投票。:/)

1 个答案:

答案 0 :(得分:0)

到位

total += pay

你必须像问题2那样计算12次安装的平衡

for month in range(12):
  balance = balance - pay
  balance = balance + monthlyInterest

比您必须将balance0进行比较并更改monthlyPaymentLowermonthlyPaymentUpper

您必须将monthlyPaymentLowermonthlyPaymentUpper进行比较,看看是否可以完成

if monthlyPaymentUpper - monthlyPaymentLower < 0.001 :
    print "now I can finish searching"

当然,在这种情况下,您需要在代码中更改更多内容:)