Итак, я пытаюсь реализовать алгоритм поиска bisection в Python, который возвращает «оптимальную» сберегательную ставку.Python Bisect Search- abs(), вызывающий сбой
Я пробовал создавать несколько различных функций, и я не понимаю, почему программа попадает в бесконечный цикл. Я знаю, что abs (current_savings - down_payment) является причиной рекурсивного бесконечного цикла, но я не знаю почему.
Первые вещи во-первых, это не объясняет, почему моя программа не работает, но здесь идет:
В конце каждого месяца я зарабатываю проценты на текущих сбережений, который применяется первым, и затем я получаю свою месячную зарплату, которая составляет всего 1/12 моей годовой зарплаты.
Я пытаюсь найти наилучшую ставку для моей месячной зарплаты, чтобы затем добавить к моим текущим сбережениям.
Моя первая функция просто проверяет, достаточно ли высокая зарплата для того, чтобы сохранить первоначальный взнос в размере 250K. Если их зарплата недостаточно высока, она печатает, что она недостаточна и возвращает False.
Моя вторая функция пытается найти наилучшую ставку («часть спасена») или лучший показатель для экономии месячной зарплаты, чтобы упасть в пределах 100 долларов от down_payment. Кроме того, я должен записать количество «шагов», которые выполняет моя функция поиска пополам, чтобы найти оптимальную скорость.
Вот код:
#Givens
annual_salary = 150000
initial_salary = annual_salary
interest_rate = float(0.04/12.0)
down_payment = float(250000.0)
semi_annual_raise = 0.07
#Bisect-search
low = float(0.0)
high = float(10000.0)
portion_saved = float((low+high)/2)
current_savings = 0
months = 0
steps = 0
def isPossible(annual_salary):
count = 0
current_savings = 0
while count < 36:
current_savings += (current_savings*interest_rate) + (annual_salary/12)
count += 1
if count % 6 == 0:
annual_salary += (annual_salary*semi_annual_raise)
if current_savings < down_payment:
print("It is not possible to pay the down payment in three years.")
return False
else:
return True
def bisearch(initial_salary,interest_rate,down_payment,semi_annual_raise,low,high,portion_saved,steps):
current_savings = 0
months = 0
while abs(current_savings - down_payment) > 100.0:
months = 0
current_savings = 0
while months < 36:
current_savings = current_savings + (initial_salary*interest_rate)
current_savings = current_savings + (initial_salary/12*portion_saved/10000.0)
months += 1
if months % 6 == 0:
initial_salary += (initial_salary*semi_annual_raise)
steps += 1
if current_savings > down_payment:
high = portion_saved
else:
low = portion_saved
portion_saved = ((low+high)/2.0)
print("Best saving rate: ", (portion_saved/10000.0))
print("Steps in bisection search: ", steps)
if isPossible(annual_salary) == True:
bisearch(initial_salary,interest_rate,down_payment,semi_annual_raise,low,high,portion_saved,steps)
И Тестовые:
Примечание: количество шагов поиска бисекция не должен быть таким же, но скорость должна быть же
Test Case 1
Enter the starting salary: 150000
Best savings rate: 0.4411
Steps in bisection search: 12
Контрольный пример 2
Enter the starting salary: 300000
Best savings rate: 0.2206
Steps in bisection search: 9
Если кто-то может мне помочь, я бы очень признателен, был на этом в течение нескольких часов, пытаясь придумать исправить.