【问题标题】:Calculate lowest monthly payment using bisection search in python在 python 中使用二等分搜索计算最低月付款
【发布时间】:2016-02-03 21:01:00
【问题描述】:

我目前正在参加 edx 上的 MITx 课程,但我对一项练习有疑问。你能告诉我为什么我在这段代码中陷入无限循环吗?我猜二分搜索循环不能正常工作,但我真的不知道为什么。代码如下:

balance = 5000
annualInterestRate = 0.18
low = balance/12
high = (balance * (1 + annualInterestRate / 12) ** 12) / 12
guess = (low + high)/2

def getBal(guess, balance, annualInterestRate):
    mon = 0
    while mon < 12:
        mon += 1
        ub = balance - guess
        balance = ub + (annualInterestRate/12) * ub
    return balance

z = getBal(guess, balance, annualInterestRate)

while abs(round(z, 2)) > 0:
    if round(z, 2) > 0:
        low = guess
    else:
        high= guess
    guess = (high+low)/2

print "Lowest Payment: " + str(round(guess,2)) 

【问题讨论】:

  • while abs(round(z, 2)) &gt; 0: 你永远不会将 z 的值更改为非正数
  • 好的,所以这个练习是关于找出在一年内偿还全部信用卡余额的最低月供。为此,我们应该使用二分搜索。最后一个while循环。而且我认为每次新值都会进入我分配给变量 z 的函数时通过更改猜测...所以我正在更改 z,不是吗?
  • 你没有改变 z。 while 循环中没有一行写着z = 是吗?
  • 另外,getBal 中的 while 循环的目的是什么?您重新计算相同的余额 12 次​​span>
  • 真的!我以为它会自动改变,只是我不断变化的猜测,但我不得不将它写在 while 循环的语句中。谢谢!

标签: python bisection


【解决方案1】:

问题出在第二个循环上。 您可以尝试这样做:

balance = 5000
annual_interest_rate = 0.18
low = balance/12
high = (balance * (1 + annual_interest_rate / 12) ** 12) / 12
guess = (low + high)/2


def get_bal(g, b, air):
    mon = 0
    while mon < 12:
        mon += 1
        ub = b - g
        b = ub + (air/12) * ub
    return b

while True:
    z = get_bal(guess, balance, annual_interest_rate)
    if abs(round(z, 2)) == 0:
        break
    if round(z, 2) > 0:
        low = guess
    else:
        high = guess
    guess = (high+low)/2

print "Lowest Payment: " + str(round(guess, 2))

【讨论】:

  • 因为我试图用“guess”的新赋值来改变 z。通过检查我从函数 getBal 获得的余额是否等于 0 来获得正确的猜测值
  • 在这种情况下你需要在while循环的每个循环中重新计算z,否则它是无限循环,但它无济于事,因为abs总是正数
  • 如果你摆脱了while循环,就不会发生二分法
  • 谢谢!!!将 z 放入循环中的事情有所帮助。我只是更改了循环语句。
  • get_bal 中的 while 循环不需要存在,除非 b 的值应该是 -= 可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多