2016-09-27 20 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ループを変更するにはどうすればよい0

より常に大きいので while newbalance > 0 は、無限ループを引き起こしているということです無限に実行する私のコードですか?

ところで: 中程度の数字では、プログラムは長い間実行され、最終的に答えが得られます。数字が大きいほど、プログラムは継続しています。

+0

値が何であるかを推測するのではなく、 'while'ループの中に' print(newbalance) 'を追加しないのはなぜですか? – CoryKramer

+0

あなたは値を印刷しましたか?それは多くの助けになるだろう! –

+0

@MooingRawr:私はそれが慎重だと思う。プログラムは、毎月の毎月の支払いを増やさずに、12ヶ月で完全なバランスを支払うための最低限の月額支払いを計算しているようです。 (毎月毎月の支払いを増やしていたのであれば、この方法で支払うことは決してありません) – user2357112

答えて

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

お支払いの金額が.01以内になることをお試しください。 – BWhite

+0

ありがとう!これは私のために働いた。私は支払いの.02以内になることができますので、それは完璧でした。 – gab

3

このループは無制限ではありませんが、解決に時間がかかります。 balanceの非常に大きな値の場合、monthlyPaymentはゼロを超えてドロップするために非常に大きくなる必要があります。

関連する問題