尝试更好地理解递归。我要创建一个函数,以给定起始金额显示特定年份的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)
某处。
非常感谢任何帮助,即使它说此功能是不可能的。
欢呼
答案 0 :(得分:2)
您创建的函数随时间计算一次总付的总价值,正如您所指出的,您可以调用两次(一次用year
,一次用year - 1
)并取获得答案的差异。
如果您真的想一遍又一遍地做到这一点,我们需要仔细考虑一下基本情况:
return 0
return initial * rate
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