Python3.6.3
跳台阶一步两步
1. 跳n(n∈N)阶台阶过程中最多有 n//2 步是跳了2阶,2阶步数固定的情况下可以用 C(总步数, 2阶的步数) 求出方法数,再把所有情况都加起来即可。
from math import factorial
from functools import reduce
from scipy.special import comb # C(N, k)
def f1(n): # sum(C(总步数, n2) for n2 in range(max2)) # max2:2步的数量最大值
return sum(comb(n-n2, n2, exact=True) for n2 in range(n//2 + 1)) # 速度比下一句快一个量级
# return sum(reduce(lambda a, b: a*b, range(n2+1, n-n2+1) or [1]) // factorial(n- 2*n2) for n2 in range(n//2 + 1))
2. 动态规划:假设n(n∈N)阶台阶的跳法数为F(n),最后一步要么跳了2阶(前面跳了n-2个台阶,方法数为F(n-2) (n>=2) ),要么跳了1阶(前面跳了n-1个台阶,方法数是F(n-1) ),所以
F(n) = F(n-1) + F(n-2) (n∈N,n>=2) ,
显然: