【问题描述】
猴子爬山一只顽猴在一座有N级台阶的小山上爬山跳跃。上山时需从山脚至山顶往上跳N级台阶,一步可跳1级,或跳2级,或跳3级,求上山有多少种不同的跳法? (N<1000)
【输入形式】
请输入台阶数:
【输出形式】
跳法数:xxxx
【样例输入】
请输入台阶数:20
【样例输出】
跳法数:121415
问题分析:
每一次都可以选择1,2,3有3种跳法
直接使用递归
jumpWay = [1, 2, 3]
footstep = input()
jumping = 0
#first write
def jump(nowstep, footstep, jumpWay):
if nowstep == footstep:
global jumping
jumping += 1
return
elif nowstep > footstep:
return
else:
for i in range(len(jumpWay)):
jump(nowstep + jumpWay[i], footstep, jumpWay)
jump(0, footstep, jumpWay)
print(jumping)
但是效率过于低
想办法对算法进行合理优化,我第一时间想到的是树,这是一颗每个节点都有3个叶子节点(除了最后几个)。而画出来的树又有很多重复的树结构,我就便想到斐波那契数列。
即先对前几个简单的赋值,后面的是前面的和。
footstep = eval(input())
steps = [-1]*1001
steps[0] = 0
steps[1] = 1
steps[2] = 2
steps[3] = 4
def f(x):
if x<0:
return 0
if x<4:
return steps[x]
if steps[x] is not -1:
return steps[x]
steps[x]=f(x-1)+f(x-2)+f(x-3)
return steps[x]
print(f(footstep))