Сброс и создание переменных до FOR l oop в цикле WHILE - PullRequest
0 голосов
/ 02 февраля 2020

Я сталкивался с практикой кодирования MIT с открытым исходным кодом Python как

Предположим, вы хотите позволить себе авансовый платеж в течение трех лет. Сколько вы должны экономить каждый месяц, чтобы достичь этого? В этой задаче вы собираетесь написать программу для ответа на этот вопрос. Для упрощения предположим: 1. Ваш полугодовой рост составляет 0,07 (7%) 2. Ваши инвестиции имеют годовой доход 0,04 (4%) 3. Первоначальный взнос составляет 0,25 (25%) от стоимости дома. 4. Стоимость дома, на который вы экономите, составляет 1 млн. Долларов.

Теперь вы попытаетесь найти наилучшую норму сбережений для достижения первоначального взноса в 1 млн. Долларов. дом в 36 месяцев. Поскольку решить эту проблему - непростая задача, мы просто хотим, чтобы ваши сбережения были в пределах 100 долларов от необходимого первоначального взноса. Напишите программу для расчета наилучшей нормы сбережений в зависимости от вашей начальной зарплаты. Вы должны использовать [поиск пополам], чтобы помочь вам сделать это эффективно. Вы должны следить за количеством шагов, которое занимает ваш поиск по разделам до финиша sh. Предел с точностью до двух десятичных знаков (т. Е. Мы можем захотеть сэкономить на 7,04% - или 0,0704 в десятичном формате - но мы не будем беспокоиться о разнице между 7,041% и 7,039%). Это означает, что мы можем искать целое число в диапазоне от 0 до 10000 (используя целочисленное деление), а затем преобразовывать его в десятичный процент (используя деление с плавающей запятой) для использования при вычислении current_savings через 36 месяцев. Использование этого диапазона дает нам только конечное число чисел, которые мы ищем, в отличие от бесконечного числа десятичных знаков от 0 до 1. Этот диапазон поможет предотвратить бесконечные циклы. Причина, по которой мы используем от 0 до 10000, состоит в том, чтобы учесть два дополнительных десятичных знака в диапазоне от 0% до 100%. Ваш код должен распечатать десятичное число (например, 0,0704 для 7,04%). Имейте в виду, что для некоторых окладов может быть невозможно сэкономить на первоначальном взносе через полтора года. В этом случае ваша функция должна уведомить пользователя о невозможности сохранить авансовый платеж в течение 36 месяцев с распечаткой выписки.

ПРИМЕР ВЫХОДА Введите стартовую зарплату: 150000 Лучшая норма сбережений: 0,4411 Шаги по поиску пополам: 12

Ниже приведено одно из найденных решений.

# user input
annual_salary = float(input('Enter your annual salary: '))

# static variables and initializers
semi_annual_raise = 0.07
r = 0.04
portion_down_payment = 0.25
total_cost = 1000000
steps = 0
current_savings = 0
low = 0
high = 10000
guess_rate = (high + low)//2
# Use a while loop since we check UNTIL something happens.
while abs(current_savings - total_cost*portion_down_payment) >= 100:
    # Reset current_savings at the beginning of the loop
    current_savings = 0
    # Create a new variable for use within the for loop.
    for_annual_salary = annual_salary
    # convert guess_rate into a float
    rate = guess_rate/10000
    # Since we have a finite number of months, use a for loop to calculate
    # amount saved in that time.
    for month in range(36):
        # With indexing starting a zero, we need to calculate at the beginning
        # of the loop.
        if month % 6 == 0 and month > 0:
            for_annual_salary += for_annual_salary*semi_annual_raise
        # Set monthly_salary inside loop where annual_salary is modified
        monthly_salary = for_annual_salary/12
        # Calculate current savings
        current_savings += monthly_salary*rate+current_savings*r/12
    # The statement that makes this a bisection search
    if current_savings < total_cost*portion_down_payment:
        low = guess_rate
    else:
        high = guess_rate
    guess_rate = (high + low)//2
    steps += 1
    # The max amount of guesses needed is log base 2 of 10000 which is slightly
    # above 13. Once it gets to the 14th guess it breaks out of the while loop.
    if steps > 13:
        break

# output
if steps > 13:
    print('It is not possible to pay the down payment in three years.')
else:
    print('Best savings rate:', rate)
    print('Steps in bisection search:', steps)

Почему необходимо сбросить значение переменной current_savings и создать for_annual_salary перед тем, как ЗА Л oop? Current_savings уже был определен как 0 в начале, и почему он создает совершенно новую переменную for_annual_salary вместо использования year_salary в FOR l oop?

1 Ответ

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

Если вы не присваиваете year_salary переменной, и ваш l oop изменил ее значение, то вы можете получить доступ к его предыдущему значению, введенному пользователем. Например:

annual_salary = input("Enter salary")
annual_salary = 10000 + 1000
print(annual_salary ) #would give you 11000, And you got some bug in your code and you want to debug what user entered the salary.
You print("annual_salary") #And you get updated salary not what user entered.

Если вы создали переменную, как показано ниже:

annual_salary = input("Enter salary")
new_annual_salary = 10000 + 1000 # some operations
print(new_annual_salary ) #Every operation was performed on new variable and if code goes wrong somewhere,you still can find new and old value of annual_salary.
print(annual_salary)
То же самое для current_savings

И вам нужно установить эти переменные в исходное значение 0, потому что при выполнении операции вам необходимо предоставить некоторое число / начальное значение.

c = 0
for i in range(3):
    c+= i
print(c) # You will get 3 not 0

d #If you don't initialize your value and performing operations you'll get undefined error
d+= 1
print(d)

NameError: имя 'd' не определено

...