2013-11-02 1 views
0
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 ...Почему я попадаю в бесконечный цикл с помощью этого простого кода Python?

+8

Я подозреваю, что вы не можете погасить кредит в $ 10, когда вы должны сделать $ 4773 в процентная ставка составляет 20%. Кредит продолжает расти, и заемщик гибнет. –

+0

В какой-то момент ваш баланс поднимается на инф. Добавьте заявление печати до или после изменения баланса, чтобы увидеть его. – VooDooNOFX

+0

Почему вы ожидаете результата '440'? – lurker

ответ

2

На каждой итерации цикла в то время, баланс увеличивается , поэтому он сохраняет больше 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 уменьшится, если pay2 больше, чем интерес balance * (annualInterestRate/12).

Чтобы лучше понять, что происходит, представьте, что это гонка между интересами и увеличением платы. Вначале интересы превышают зарплату, поэтому она продолжает расти, но в какой-то момент оплата может быть достаточно большой, чтобы уменьшить balance, и на данный момент pay всегда будет больше, чем интерес. Однако, если интересы начинаются на высоком уровне, проценты будут расти, и заработная плата никогда не достигнет суммы процентов (это на самом деле грустно). Математическая причина заключается в том, что заработная плата является линейной, тогда как интересы не растут и возрастают, поскольку balance продолжает расти.

1

С кодом ничего не случилось. С вашей формулой увеличение баланса на 4773 больше, чем увеличение платежа, которое составляет 10. Это объясняет, почему баланс продолжает расти до бесконечности, и поэтому цикл никогда не заканчивается.

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

Я думаю, вы могли бы хотеть, чтобы снизить интерес, или сделать вашу зарплату выше, так что вы можете оплатить свой долг :)