【问题标题】:What's wrong with this bisection search algorith?这个二分搜索算法有什么问题?
【发布时间】:2013-11-02 13:23:28
【问题描述】:

我的 MITx CS 课程有一个作业,但我遇到了以下问题:

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

balance - 信用卡上的未结余额

annualInterestRate - 年利率小数

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

什么是好的上限?想象一下,我们不是按月支付,而是 年底还清了全部余额。我们最终的 工资必须高于我们每月支付的费用 分期付款,因为利息是在我们的余额上复利的 每个月都没有还清。所以每月的一个很好的上限 在获得利息后,付款将是余额的十二分之一 全年按月计算。

简而言之:

月利率=(年利率)/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))

帮助?

像往常一样,不寻找完整的解决方案或源代码,只是提示我哪里出错了。 (我总是得到反对票。:/)

【问题讨论】:

  • 第一个提示:如果您需要了解发生了什么,调试器可能会很有帮助。
  • 不,我完全明白那里发生了什么,我之前写过一个二分算法,但这一次,我不知道出了什么问题。
  • 你看相关问题了吗?
  • 是的,但就像我之前说过的,我不想复制粘贴别人的代码,我想自己解决我的问题
  • 显示预期结果。顺便说一句:“MITx 6.00.1x 计算机科学和 Python 编程简介”?

标签: python bisection


【解决方案1】:

到位

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"

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

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2021-08-05
    • 2011-05-30
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多