コードを次のように変更しました。
balance = 999999
annualInterestRate = .18
monthlyInterestRate = annualInterestRate / 12
balanceCOPY = balance
#Bisection search parameters
low = balance / 12
high = (balance * (1 + monthlyInterestRate ** 12)) / 12
epsilon = .01
print "starting high and low guesses"
print "high: %s" % high
print "Low: %s" % low
print "\n"
guess = (low + high) / 2
for i in range(5):
print "Type of balance: %s" % type(balance)
print "Balance is: %s" % balance
print "Low: %s" % low
print "High: %s" % high
print "Guess: %s" % guess
print "monthly interest %s" % (monthlyInterestRate * balance)
for month in range(1, 13):
balance -= guess
balance += monthlyInterestRate * balance
print "balance after %s" % balance
if balance > 0 and balance > epsilon:
print "Change low"
low = guess
balance = balanceCOPY
elif balance < 0 and balance > -epsilon:
high = guess
balance = balanceCOPY
else:
print('Lowest payment: ', str(round(guess, 2)))
break
guess = (low + high) / 2
print "\n"
いくつかのメモ: 「hi」と「lo」を「high」と「low」に変更しました。切り捨てられた変数名は読みにくくなるため、変数名を切り捨てない方がよいでしょう。
さまざまな変数の値を示すデバッグ ステートメントを追加しました。
上記を実行した結果は次のとおりです。
starting high and low guesses
high: 83333.25
Low: 83333
Type of balance: <type 'int'>
Balance is: 999999
Low: 83333
High: 83333.25
Guess: 83333.125
monthly interest 14999.985
balance after 92550.599997
Change low
Type of balance: <type 'int'>
Balance is: 999999
Low: 83333.125
High: 83333.25
Guess: 83333.1875
monthly interest 14999.985
balance after 92549.7726951
Change low
Type of balance: <type 'int'>
Balance is: 999999
Low: 83333.1875
High: 83333.25
Guess: 83333.21875
monthly interest 14999.985
balance after 92549.3590442
Change low
Type of balance: <type 'int'>
Balance is: 999999
Low: 83333.21875
High: 83333.25
Guess: 83333.234375
monthly interest 14999.985
balance after 92549.1522187
Change low
Type of balance: <type 'int'>
Balance is: 999999
Low: 83333.234375
High: 83333.25
Guess: 83333.2421875
monthly interest 14999.985
balance after 92549.048806
Change low
このことから、低い値が高い値に収束していることがわかります。つまり、最初の高値は十分に高くありません。それらが同じ値になると、ループは何も変更されず、永遠に続きます。
私はこの行だと思います:
elif balance < 0 and balance < -epsilon:
読む必要があります:
elif balance < 0 and balance > -epsilon:
より少ないよりもとの間0
のバランスが必要だと思うので-epsilon
-epsilon
また、@WinstonEwertが指摘したように:
hi = (balance*(1+monthlyInterestRate**12))/12
する必要があります
hi = (balance*(1+monthlyInterestRate)**12)/12