问题:每次爬一个台阶,或者两个台阶,爬n哥台阶有多少种可能。直接使用斐波那契数列可求解但是不容易理解
使用递归拆分子问题,n个台阶,如果走一步,剩下n-1个台阶,如果走2步,还有n-2个台阶,这样直到走完。
import time
def ff(n):
if n==1:
return 1
if n==0 :
return 1
return ff(n-1)+ff(n-2)
n=3
t = time.time()
a= ff(n)
print('times:',time.time()-t,a)
在这当n比较大时有大量的重复计算,所以可以对重复计算进行改进。
import time
def ff(n):
if n==1:
return 1
if n==0 :
return 1
if s[n]==-1:
s[n]= ff(n-1)+ff(n-2)
return s[n]
n=30
s=[-1]*(n+1)
t = time.time()
a= ff(n)
print('times:',time.time()-t,a)
问题衍生:每次爬一个台阶,或者两个台阶,爬n个台阶有哪些轨迹,这里不要求个数,让输出轨迹。
需要在每一迭代的时候记录下走过的路径。
import time
def ff(n,f):
if n==1:
print(f+'1')
return
if n==0 :
print(f)
return
ff(n-1,f+'1')
ff(n-2,f+'2')
n=4
s=[-1]*(n+1)
t = time.time()
ff(n,'')
print('times:',time.time()-t)