搜索
写经验 领红包

阶楼梯(阶楼梯上楼问题)

导语:数学排列组合:N级楼梯,每次只能跨1或2级,共有几种走法?

思考:N级楼梯,每次只能跨1或2级,走完这楼梯共有多少种走法?

上一章《python递归与迭代:N级楼梯,每次只能跨1或2级,共有几种走法?》,我使用了数学递推法来解题,并通过python使用递归算法、迭代算法来计算解题。今天,我将跟大家一起探讨和使用数学中的排列组合方法一起解题。

排列组合知识点复习:

1、在数学中,从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示

2、从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示

3、组合数公式:

解题思路:

1、先抽取一个N=3的情况,穷举所有走法进行观察。用队列list把每次跨过的阶梯数记录下来,跨1级记录为数值1,跨2级记录为数值2。

N=3级楼梯走法:

1、如每次走1级,则 list=[1,1,1]

2、如第1次走2级,第2次走1级,则 list=[2,1]

3、如第1次走1级,第2次走2级,则 list=[2,1]

上述过程中有3个不同 list,所以3级楼梯走法共有 3 种

2、从上述步骤1中,可以看出,有多少个list,就有多少种走法,记为F(N)

3、再抽取一个N=5的情况,穷举所有走法进行观察,记录数值2的元素个数x 和 list长度(即list中元素的数量)关系,确定x的取值范围。

N=5级楼梯走法:

1、list=[1,1,1,1,1], 数值2的元素个数x=0,list长度=N=5

2、list=[2,1,1,1], 数值2的元素个数x=1,list长度=N-x=5-1=4

3、list=[1,2,1,1], 数值2的元素个数x=1,list长度=N-x=5-1=4

4、list=[1,1,2,1], 数值2的元素个数x=1,list长度=N-x=5-1=4

5、list=[1,1,1,2], 数值2的元素个数x=1,list长度=N-x=5-1=4

6、list=[2,2,1], 数值2的元素个数x=2,list长度=N-x=5-2=3

7、list=[2,1,2], 数值2的元素个数x=2,list长度=N-x=5-2=3

8、list=[1,2,2], 数值2的元素个数x=2,list长度=N-x=5-2=3

上述过程中,x取值范围为:0<=x<=k=int(N/2)=int(5/2)=2,即0<=x<=2,list长度=N-x

4、通过观察上述步骤3发现:

(1)、N级楼梯,元素数值全为1的list长度为N,每多1个数值为2的元素,list长度就减1.如果list中有x个数值为2的元素,则list长度为N-x。

(2)、当数值2的元素个数为x个时,那么 list 数量相当于从N-x个数值全为1的元素中抽取x个元素将其元素值变为2的方法有几种。list长度=N-x 的队列 list 共有 C(N-x,x) 个。

(3)、当list中的数值为1的元素个数=0或1时,x存在最大值k(k=N/2,然后k向下取整),记为 k=int(N/2),0<=x<=k。

5、把上述过程中,累加x从0到k赋值计算出来的list数量,就是F(N)。

如上述中,N=5级楼梯走法:

x取值范围为:0<=x<=k=int(N/2)=int(5/2)=2,即0<=x<=2,list长度=N-x

(1) 当 x=0时,即list长度=5的 list 数量为:C(N-x,x)=C(5-0,0)=C(5,0)=1

(2) 当 x=1时,即list长度=4的 list 数量为:C(N-x,x)=C(5-1,1)=C(4,1)=4

(3) 当 x=2时,即list长度=3的 list 数量为:C(N-x,x)=C(5-2,2)=C(3,2)=3

所以,F(N)=F(5)=C(5,0)+C(4,1)+C(3,2)=1+4+3=8

综上,通过研究跨2步的次数为x(0<=x<=k)的组合数,其中k=int(N/2),就可以得出走法F(N)的值,即:

F(N)=C(N-x,x=0)+C(N-x,x=1)+...+C(N-x,x=k)

=C(N,0)+C(N-1,1)+...++C(N-k,k)

=

结果验证:

当N=1时,0<=x<=int(N/2)=0, F(N=1)=C(N=1,0)=C(1,0)=1

当N=2时,0<=x<=int(N/2)=1, F(N=2)=C(N-x,x=0)+C(N-x,x=1)=C(2,0)+C(1,1)=1+1=2

当N=3时,0<=x<=int(N/2)=1, F(N=3)=C(N-x,x=0)+C(N-x,x=1)=C(3,0)+C(2,1)=1+2=3

当N=4时,0<=x<=int(N/2)=2, F(N=4)=C(N-x,x=0)+C(N-x,x=1)+C(N-x,x=2)=C(4,0)+C(3,1)+C(2,2)=1+3+1=5

当N=5时,0<=x<=int(N/2)=2, F(N=5)=C(N-x,x=0)+C(N-x,x=1)+C(N-x,x=2)=C(5,0)+C(4,1)+C(3,2)=1+4+3=8

当N=6时,0<=x<=int(N/2)=3, F(N=6)=C(N-x,x=0)+C(N-x,x=1)+C(N-x,x=2)+C(N-x,x=3)=C(6,0)+C(5,1)+C(4,2)+C(3,3)=1+5+6+1=13

当N=7时,0<=x<=int(N/2)=3, F(N=7)=C(N-x,x=0)+C(N-x,x=1)+C(N-x,x=2)+C(N-x,x=3)=C(7,0)+C(6,1)+C(5,2)+C(4,3)=1+6+10+4=21

......

python脚本实现如下:

import mathimport timeprint(&39;)&39;&39;&39;def fun_zuhe_jisuan(n, m):    result_n = 0    try:        if n <= 0 or m < 0 or m > n:            result_n = 0        elif m == 0:            result_n = 1        else:            fenzi = math.factorial(n)  39;组合: 计算从n个数中抽取m个数出来的方法,异常如下: &39;&39;计算N级楼梯走法&39;& n级楼梯走法    try:        if n == 1:            fn = 1        else:            k = int(n/2)   遍历数值为2元素个数数量                fn += fun_zuhe_jisuan(n-i, i)  39;组合方法计算异常:&39;3、组合方法& 开始运行时间    fn = fun_get_fn(i)    end_time = time.time()   计算运行时间,即计算过程耗时(毫秒)    print(f&39;)

python运行结果:

python数学组合方法计算结果

以上,便是通过数学中排列组合方式进行解题的思路、步骤、和计算结果。

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小芦创作整理编辑!