为什么我用这个简单的Python代码进入无限循环?

时间:2013-11-02 00:45:12

标签: python loops infinite

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的结果时...

2 个答案:

答案 0 :(得分:2)

在while循环的每次迭代中,余额增加,因此它保持大于0.您可以打印余额的中间值:

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)。因此,如果balance大于兴趣pay2balance * (annualInterestRate/12)基本上会减少。

为了更好地了解正在发生的事情,想象一下,这是利益与薪酬增长之间的竞争。利息在开始时大于支付,因此它不断增加,但在某些时候,支付可能大到足以减少balance,此时,pay将始终大于利息。但是,如果利益从高层开始,利息就会增长,薪酬永远不会达到利息(这实际上是令人悲伤的)。数学原因是,当balance继续增长时,薪酬是线性的,而利益则不是越来越多。

答案 1 :(得分:1)

代码没什么问题。根据您的公式,4773的余额增加超过了支付的增加,即10。这就解释了为什么平衡会不断增长到无穷大,因此循环永远不会结束。

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

我认为你可能想降低你的兴趣,或者让你的工资更高,所以你可以偿还你的债务:)

相关问题