Рекурсивная функция для ИПЦ - PullRequest
0 голосов
/ 05 октября 2018

Тренировка, пытающаяся лучше понять рекурсию.Я хочу сделать функцию, которая показывает увеличение ИПЦ для конкретного года с учетом стартовой суммы.

Если исходная сумма равна 100000, а показатель CPI равен 5%, то f (0) = 100000, f (1) = 5000, f (2) = 5250 и т. Д. Я хочу вернуть столбец CPIincrease изниже

                               rate  0.05
n   TotalCPI    CPIincrease 
0   100000      
1   105000      5000    
2   110250      5250    
3   115762.5    5512.5  
4   121550.625  5788.125    
5   127628.1563 6077.53125  
6   134009.5641 6381.407812 
7   140710.0423 6700.478203 
8   147745.5444 7035.502113 
9   155132.8216 7387.277219 
10  162889.4627 7756.64108

Пока у меня есть TotalCPI из столбца вышеприведенной таблицы

def CPIincreases(n):
    if n<=0:
        return initial
    else:
        return (CPIincreases(n-1))*(1+CPIrate)

initial = 100000
CPIrate = 0.05

print(CPIincreases(1),CPIincreases(2),CPIincreases(3),CPIincreases(4))
output: 105000.0 110250.0 115762.5 121550.625

Теперь я потерян.Поскольку вывод показывает, что я должен добавить в

CPIincrease(n) - CPIincrease(n-1)

Где-то.

Любая помощь очень ценится, даже если сказать, что эта функция невозможна.

Приветствия

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Мне нравится, как ответы Джона более сложны.Вот мой код, я пытался сделать имена переменных самоочевидными, но я также кратко опишу их.

total_cpi: first column
cpi_increase: 2nd column
cpi_rate: CPIrate

Если нам нужно решить это в одной рекурсивной функции, мы можем решить эту проблему толькос помощью переменных состояния: -

def calculate_cpi_increase(total_cpi, cpi_increase, year):
    if year == 0:
        return total_cpi, cpi_increase
    else:
        return calculate_cpi_increase(total_cpi*(1+cpi_rate), total_cpi*cpi_rate, year-1)

cpi_rate = 0.05

calculate_cpi_increase(100000, 0, 10)

результат: (162889.46267774416, 7756.641079892579)

0 голосов
/ 05 октября 2018

Прежде всего, вы не должны вызывать рекурсивную функцию со всеми значениями, которые вы хотите напечатать.Например, если вы звоните F(2), F(3), F(4) и F(5), вы должны повторить вычисления для F(2) 4 раза, так как каждый другой вызов требует этого вычисления.

Вы также не должны использовать глобальные переменные, вы можете использовать мой простой подход и инкапсулировать их в другую функцию.В этом коде я генерирую не только одно значение, это генерирует полную таблицу, список кортежей Python.Любой кортеж - это два значения: значение и приращение за итерацию.Полная таблица печатается другой функцией.

def CPITable(n, initial = 100000, CPIrate = 0.05):

    def CPITableRecurse(n):
        if n<=0:
            return [(initial,0)]
        else:
            CPI = CPITable(n-1)
            inc = CPI[-1][0] * CPIrate
            CPI.append((CPI[-1][0] + inc , inc ))
            return CPI

    return CPITableRecurse(n)


def printTable(table):
    i = 0
    for line in table:
        print ( str(i) + " %5.2f %5.2f" % line)
        i += 1


printTable(CPITable(6))
#output: 
#   0 100000.00  0.00
#   1 105000.00 5000.00
#   2 110250.00 5250.00
#   3 115762.50 5512.50
#   4 121550.62 5788.12
#   5 127628.16 6077.53
#   6 134009.56 6381.41
0 голосов
/ 05 октября 2018

Созданная вами функция вычисляет общую стоимость единовременной суммы за определенное время, и, как вы указали, вы можете вызвать ее дважды (один раз с year и один раз с year - 1) и взять разницу, чтобы получитьВаш ответ.

Если вы действительно хотите сделать это рекурсивно за один раз, нам нужно продумать базовые случаи:

  • Год 0: в начале интерес отсутствует
    • return 0
  • Год 1: После первого года изменение составляет только начальную сумму, умноженную на процентную ставку
    • return initial * rate
  • Год 2+: С этого года мы делаем то же, что и в прошлом году, плюс проценты по этому проценту
    • return last_year + rate * last_year
    • Или просто: return last_year * (1 + rate)

Теперь мы можем собрать все это вместе:

def cpi_increase(year, initial, rate):
    if year == 0:
        return 0

    if year == 1:
        return initial * rate

    return (1 + rate) * cpi_increase(year - 1, initial, rate)

Если мы распечатаем это, мы увидим значения для соответствия:

initial = 100000
rate = 0.05

for year in range(11):
    print('{year:<5} {total:<21} {cpi_increase}'.format(
        year=year,
        total=initial * (1 + rate) ** year,
        cpi_increase=cpi_increase(year, initial, rate)
    ))

Значения:

0     100000.0              0
1     105000.0              5000.0
2     110250.0              5250.0
3     115762.50000000001    5512.5
4     121550.62500000003    5788.125
5     127628.15625000003    6077.53125
6     134009.56406250005    6381.407812500001
7     140710.04226562506    6700.478203125001
8     147745.5443789063     7035.502113281251
9     155132.8215978516     7387.2772189453135
10    162889.4626777442     7756.64107989258

В наших базовых случаях также показано, как создать прямой расчет.В год y мы применили умножение (1 + rate) y - 1 раз и основание (initial * rate) один раз.Это дает нам:

def cpi_increase_direct(year, initial, rate):
    if year <= 0:
        return 0

    return initial * rate * (1 + rate) ** (year - 1)
...