n阶楼梯,一次走1,2,3步,求多少种不同走法
Posted offline-ant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n阶楼梯,一次走1,2,3步,求多少种不同走法相关的知识,希望对你有一定的参考价值。
##已知n阶楼梯,一次可以迈1,2,3步。求所有走法
## 如果要列出走法,时间复杂度太高,O(n)=2**n,前两个函数遍历走法。
## 如果只是单纯列出走法数量,就简单多了,也但是很容易内存爆表。
## n层走法,可以视为n-1层再走一步,n-2层走两步,n-3层走三步。题目都可以按这个思路解决
import copy,time
lv=5
n1=1000000
fzd=0
lg=[]
if lv<=1:
def dg(ln,n,l):
global fzd
fzd+=1
if ln<n:
l1=l[:]+[1]
l2=l[:]+[2]
l3=l[:]+[3]
return dg(ln+1,n,l1),dg(ln+2,n,l2),dg(ln+3,n,l3)
if ln==n:
return lg.append(l)
##for j in range(10):
## dg(0,j,[])
## print(len(lg))
## lg=[]
t=time.time()
dg(0,n1,[])
print(‘dg1 %s阶用时%s s,时间复杂度%s‘%(str(n1),str(time.time()-t),fzd))
lg=[]
fzd=0
## 另一种递归 可以将n阶台阶分解为走一步+n-1阶,走两步+n-2阶,走三步+n-3阶
## 时间复杂度太高了。
if lv<=2:
def dg2(n):
global fzd
for i in range(1,n+1):
if i==1:
lg.append([[1]])
elif i==2:
lg.append([[1,1],[2]])
elif i==3:
lg.append([[1, 1, 1],[1, 2],[2, 1],[3]])
else:
##深拷贝耗时太长
##ln1,ln2,ln3=copy.deepcopy(lg[-1]),copy.deepcopy(lg[-2]),copy.deepcopy(lg[-3])
ln1,ln2,ln3=lg[-1],lg[-2],lg[-3]
for j in ln3:
fzd+=1
j.append(3)
for j in ln2:
fzd+=1
j.append(2)
for j in ln1:
fzd+=1
j.append(1)
lg.append(ln3+ln2+ln1)
return lg
t=time.time()
dg2(n1)
print(‘dg2 %s阶用时%s s,时间复杂度%s‘%(str(n1),str(time.time()-t),fzd))
lg=[]
fzd=0
##print(len(lg[-1]))
##for n,i in enumerate(lg):
## print(‘第%s次展示:‘%(n+1))
## for j in i:
## print(j)
#### 只计数
## 正面横推
if lv<=3:
def dgcount(n):
for i in range(1,n+1):
if i==1:
lg.append(1)
elif i==2:
lg.append(2)
elif i==3:
lg.append(4)
else:
lg.append(lg[-3]+lg[-2]+lg[-1])
return lg
t=time.time()
dgcount(n1)
print(‘dgcount %s阶用时%s s‘%(str(n1),str(time.time()-t)))
## 反向递推
if lv<=4:
def dgcount2(n):
if n==1:
return 1
elif n==2:
return 2
elif n==3:
return 4
else:
return dgcount2(n-1)+dgcount2(n-2)+dgcount2(n-3)
t=time.time()
dgcount2(n1)
print(‘dgcount2 %s阶用时%s s‘%(str(n1),str(time.time()-t)))
## 正面横推2
if lv<=5:
def dgcount3(n):
if n>3:
num1=4
num2=2
num3=1
elif n==1:
return 1
elif n==2:
return 2
elif n==3:
return 4
for i in range(4,n+1):
num1,num2,num3=num1+num2+num3,num1,num2
return num1
t=time.time()
dgcount3(n1)
print(‘dgcount3 %s阶用时%s s‘%(str(n1),str(time.time()-t)))
以上是关于n阶楼梯,一次走1,2,3步,求多少种不同走法的主要内容,如果未能解决你的问题,请参考以下文章
有n个台阶的楼梯,有人可以1次走1步,也可以走两步,也可以走三步,问有多少种走法?