0

我已经为这个问题发疯了好几个小时,而且我一直在一遍又一遍地重做它!在这一点上,我认为我实际上看到了数字在我周围飞舞。

无论如何,我应该编写一个程序,找出一年内每月支付的正确金额,以偿还信用卡债务。因此,对于这个程序,必须满足一些条件。

  • 必须使用二分搜索 ((low + high) / 2)
  • 有一个固定的平衡
  • 有年利率。

这是我目前的代码,我得到的只是无限循环。我在这里做错了什么?

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (1 + monthly_interest)**12) / 12.0
epsilon = 0.01
ans = float(lower_bound + upper_bound) / 2

while abs((balance * (1 + monthly_interest)**12) / 12.0) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)
    new_balance = 0
    interest = 0

    for month in range(0, 12):
        interest += ans + (1 + monthly_interest)
        new_balance += ans + interest

    if new_balance > balance:
        upper_bound = ans
        print "low" + str(new_balance)
    elif new_balance < balance:
        lower_bound = ans
        print "high" + str(new_balance)
    else:
        print "What's going on here?"

print "Lowest payment: %r" % ans
4

1 回答 1

1

我相信这里有几件事是错误的,所以首先,你的 while 是一个无限循环,因为你使用的条件永远不会收敛到一个解决方案(变量值永远不会在循环内改变)。最重要的是,这种问题的条件(暂时)似乎是错误的。

这就是我认为您正在尝试做的事情,您正在尝试找到“每月付款”的上限和下限,并且收敛条件是这些界限之间的差异应该小于恒定的 epsilon(在其他的话误差应该小于epsilon)。

在您的循环中,您正在正确计算中点,该中点已经考虑了利息,但正在再次计算。更改上下界的条件没有考虑兴趣,所以这部分代码有点乱。

因此,修改这些条件,您的程序实际上会收敛到一个解决方案:

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (2 + monthly_interest)**12) / 12.0
epsilon = 0.001
ans = float(lower_bound + upper_bound) / 2
total_debt=balance * (1 + annualInterestRate)
print total_debt
while (upper_bound - lower_bound) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)

    if total > total_debt:
        upper_bound = ans
        print "low " + str(total)
    elif total < total_debt:
        lower_bound = ans
        print "high " + str(total)
    else:
        print "Solution found"
    break


print "Lowest payment: %r" % ans

希望能帮助到你!

于 2014-09-10T19:14:56.383 回答