【问题标题】:Why do I get into an infinite loop with this simple Python code?为什么我会使用这个简单的 Python 代码进入无限循环?
【发布时间】:2013-11-02 00:45:11
【问题描述】:
balance = 4773
annualInterestRate = 0.2

pay = 10

while balance > 0:
    for key in range(1,13):
        balance -= pay
        balance = balance + (balance * (annualInterestRate / 12.0))
    pay += 10

print('Lowest Payment: '+str(pay))

当余额为 3329 时,它返回 310 的好结果,但当 4773 时我进入无限循环而不是得到 440 的结果...

【问题讨论】:

  • 我怀疑当您以 20% 的利率欠 4773 美元时,您无法以 10 美元还清贷款。贷款不断增长,借款人破产。
  • 在某个时候,您的余额会攀升至 inf。在修改余额之前或之后添加打印语句以查看它。
  • 你为什么期待440的结果?
  • @JohnBallinger 这是一堂很好的人生课。

标签: python loops infinite


【解决方案1】:

while循环的每一次迭代,balance都会增加,所以保持大于0。可以打印balance的中间值:

balance = 4773
annualInterestRate = 0.2

pay = 10

while balance > 0:
    print balance
    for key in range(1,13):
        balance -= pay
        balance = balance + (balance * (annualInterestRate / 12.0))
    pay += 10

输出:

4773
5686.32508646
6666.19699272
7727.21549777
8887.18344195
10167.8094501
11595.5648257
13202.7284403
15028.6608622
17121.3580173
...

您能解释一下如何获得 440 吗?用哪个微积分?所以我们可以尝试修复您的代码。看起来3390 是您可以设置为balance 的更大(整数)初始值,它会收敛。

在你的循环中,你这样做:

balance -= pay
balance = balance + (balance * (annualInterestRate / 12.0))

相当于:

balance = balance - pay + ((balance - pay) * (annualInterestRate / 12.0))

或:

balance = balance + balance * (annualInterestRate/12) - pay * (annualInterestRate/12)

让我们简化,但把pay2 = pay * (annualInterestRate/12)。所以,基本上,如果pay2 大于兴趣balance * (annualInterestRate/12)balance 就会减少。

为了更好地理解发生了什么,想象一下这是一场利益和加薪之间的竞赛。开始时利息大于报酬,所以它不断增加,但在某些时候,报酬可能大到足以减少balance,此时,pay 将永远大于利息。但是,如果利息从高位开始,利息就会增长,而工资永远达不到利息的数额(这实际上是可悲的)。数学上的原因是报酬是线性的,而利息不是线性的,并且随着balance 的持续增长而越来越多。

【讨论】:

    【解决方案2】:

    代码没有问题。用你的公式,4773处余额的增加大于支付的增加,即10。这就解释了为什么余额不断增长到无穷大,因此循环永远不会结束。

    while balance > 0:
        for key in range(1,13):
            balance -= pay
            balance = balance + (balance * (annualInterestRate / 12.0))
        pay += 10
    

    我想你可能想降低你的利息,或者提高你的薪水,这样你就可以偿还债务:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2022-08-19
      • 2016-04-08
      • 2022-11-28
      相关资源
      最近更新 更多