Python: Попытка приблизить 'part_saved' в следующем коде - PullRequest
0 голосов
/ 03 февраля 2020
#This part asks for the user input
annual_salary = float(input("Enter your annual salary:"))

#Declaring all the variables
total_cost = 1000000
High = 1.0
Low = 0.0
portion_saved = (High +Low)/2.0
semi_annual_raise = 0.07
r = 0.04 #annual investment return
portion_down_payment = 0.25
num_guesses = 0
epsilon = 100
total_saving = 0.0
months = 0

#Calculations next
while abs(total_cost - total_saving) >= epsilon:
    num_guesses += 1
    total_saving = 0.0

    while total_saving < (total_cost*portion_down_payment):
        monthly_salary = annual_salary/12
        monthly_saving = monthly_salary*portion_saved
        total_saving += (monthly_saving + total_saving*r/12)
        months += 1
        if months%6 == 0:
            annual_salary += annual_salary*semi_annual_raise

    if (total_saving < total_cost):
        Low = portion_saved
    else:
        High = portion_saved
    portion_saved = (Low+High)/2.0

print("Best savings rate:", portion_saved)
print("Number of steps:", num_guesses)

Но код входит в бесконечное число l oop. При проверке с использованием команды печати выясняется, что переменная part_saved принимает значение 1,0 на каждой итерации. Но я не могу понять, почему это происходит. Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Ну, я решил это. Пришлось внести две поправки.

  1. Умножил 'total_cost' на 'portions_down_payment', так как мне действительно пришлось рассчитать ставку для оплаты авансового платежа.
  2. Я сбрасываю значение годовой суммы для каждой итерации до начального значения.

Конечный код выглядит так:

#This part asks for the user input
starting_salary = float(input("Enter your annual salary:"))

#Declaring all the variables
total_cost = 1000000
High = 1.0
Low = 0.0
portion_saved = (High +Low)/2.0
semi_annual_raise = 0.07
r = 0.04 #annual investment return
portion_down_payment = 0.25
num_guesses = 0
epsilon = 100
total_saving = 0.0
months = 36
print(portion_saved)

#Calculations next
while abs(total_cost*portion_down_payment - total_saving) >= epsilon:
    num_guesses += 1
    total_saving = 0.0
    annual_salary = starting_salary
    for i in range (months):
        monthly_salary = annual_salary/12
        monthly_saving = monthly_salary*portion_saved
        total_saving += (monthly_saving + total_saving*r/12)
        if i%6 == 0:
            annual_salary += annual_salary*semi_annual_raise

    if (total_saving > total_cost*portion_down_payment):
        High = portion_saved
    else:
        Low = portion_saved

    portion_saved = (Low+High)/2.0

print("Best savings rate:", portion_saved)
print("Number of steps:", num_guesses)
0 голосов
/ 03 февраля 2020

ваш код всегда входит в оператор if, поэтому вы всегда устанавливаете для Low значение part_saved:

    1: Low = 0, portion_saved= 1/2
    2: Low = 1/2, portion_saved= 1.5/2
    3: Low = .75, portion_saved= 1.75/2
    4: Low = .875, portion_saved= 1.875/2
    5: and so on....
...