2016-09-27 2 views
1

Ниже приведен фрагмент кода, который вычисляет баланс кредитной карты, но не работает, когда balance имеет экстремальное значение (например, balance=9999999999 ниже). Он выдает код через бесконечный цикл. У меня есть пара теорий о том, как исправить этот недостаток, но не знаю, как двигаться вперед с ними. Вот мой код:Почему у меня есть бесконечный цикл в моем коде?

balance = 9999999999 
annualInterestRate = 0.2 
monthlyPayment = 0 

monthlyInterestRate = annualInterestRate /12 
newbalance = balance 
month = 0 

while newbalance > 0: 
    monthlyPayment += .1 
    newbalance = balance 

    for month in range(1,13): 
     newbalance -= monthlyPayment 
     newbalance += monthlyInterestRate * newbalance 
     month += 1 
print("Lowest Payment:" + str(round(monthlyPayment,2))) 

Моя теория состоит в том, что while newbalance > 0 вызывает бесконечный цикл, потому что NewBalance всегда больше 0.

Как я могу изменить этот while цикл так, что он не вызывает мой код работает бесконечно?

К слову: С умеренными цифрами программа длится долго и, наконец, дает ответ. Для больших чисел программа продолжает работать.

+0

Почему вы не добавляете 'print (newbalance)' в свой 'while' цикл вместо того, чтобы гадать, что это за значение? – CoryKramer

+0

Вы напечатали значения? это очень помогло бы! –

+0

@MooingRawr: Я думаю, что это преднамеренно; программа, по-видимому, рассчитывает минимальный ежемесячный платеж для полного баланса в течение 12 месяцев, не увеличивая ежемесячный платеж каждый год. (Если это увеличивало ежемесячный платеж каждый год, вы никогда не заплатите его таким образом.) – user2357112

ответ

0

Метод деления пополам выполняется намного быстрее, если вы можете использовать его в своем задании. Однако вам не поможет, если вам необходимо увеличить ежемесячный платеж на 0,01.

static_balance = balance 
interest = (annualInterestRate/12) 
epsilon = 0.01 
lo = balance/12 
hi = balance 

while abs(balance) > epsilon: 
    balance = static_balance 
    min_pmt = (hi+lo)/2 
    for i in range(12): 
     balance -= min_pmt 
     balance *= 1+interest 
    if balance > 0: 
     lo = min_pmt 
    else: 
     hi = min_pmt 
print("Lowest payment: ", round(min_pmt, 2)) 
+0

Спасибо за ваше время. Я пробовал этот код, и он исправил мою проблему с медленным запуском кода. Однако он больше не дает правильного ответа. – gab

+0

Попробуйте это, если вам разрешено находиться в пределах 0,01 платежа. – BWhite

+0

Спасибо! Это сработало для меня. Я могу быть в пределах 0,02 платежа, так что это было идеально. – gab

3

Этот цикл не является бесконечным, но потребуется много времени для его решения. При очень больших значениях balance, monthlyPayment должно получиться очень большим, чтобы опустить его за ноль.