CPI的递归函数

时间:2018-10-05 11:14:14

标签: python function recursion economics

尝试更好地理解递归。我要创建一个函数,以给定起始金额显示特定年份的CPI增长。

假设起始金额为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 :(得分:2)

您创建的函数随时间计算一次总付的总价值,正如您所指出的,您可以调用两次(一次用year,一次用year - 1)并取获得答案的差异。

如果您真的想一遍又一遍地做到这一点,我们需要仔细考虑一下基本情况:

  • 0年级:一开始没有兴趣
    • return 0
  • 第一年:第一年后的变化只是初始金额乘以利率
    • 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)

答案 1 :(得分:1)

我喜欢乔恩的答案更加详尽。这是我的代码,我试图使变量名易于说明,但我也会对其进行简要描述。

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)

答案 2 :(得分:1)

首先,您不应该使用要打印的所有值调用递归函数。例如,如果您呼叫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