看到此题,我们要回忆一下高中数学的排列组合问题

一、先从一个例子分析一下这个题目(‘1’是每次上一级台阶,‘2’是每次上两级提台阶)

假如有5级台阶,则有(1,1,1,1,1)、(1,1,1,2)、(1,2,2)这三种组合方式

其中(1,1,1,1,1)不需要再进行排列

(1,1,1,1,2)如果2的位置不同则是不同的走法,既 =5种组合

(1,2,2)同理,如果2的位置不同则是不同的走法,既 =3种组合

则当 台阶为5的时候有1+5+3=8种走法

二、了解了这个题目后,我们来研究一下这个题的思路

我们需要计算传入参数k中有多少个‘2’,既计算k整除2(k//2),算出来后我们就可以用循环去构建

1个‘2’,(k-2)个‘1’的时候有多少种排列方式

2个‘2’,(k-2*2)个‘1’的时候有多少种组合方式

......

n//2个‘2’,[k-(n//2)*2]个‘1’的时候有多少种组合方式。

列子:

假如传入参数k=7,k中有7//2=3个‘2’。

用循环去构建1个‘2’,5-1*2个‘1’的时候有多少种排列方式;

2个‘2’,7-2*2个‘1’的时候有多少种排列方式;

3个‘2’,7-3*2个‘1’的时候有多少种排列方式。

最后把这三种组合算出来的排列方式加起来再加一次一步一步走的情况就是所有不同种的上台阶方法。

三、推导n个‘1’,m个‘2’时的排列公式、结果

传入台阶数k,则‘2’的个数:m=k//2,‘1’的个数:n=k-2*m

推到出公式m个‘1’,n个‘2’时的走法有种走法

四、代码求解

首先先知道如何用计算机来计算排列

拆分一下公式

假如计算=,分子每次减少1,分母每次增加1构建循环,代码如下

# 计算排列n为上标,m为下标
def array(n, m):num = 1  # 初始化for i in range(1, n + 1):num *= m / im -= 1return num

通过(三)中的公式计算出每种组合的排列后就很简单了,只需要把每次组合的排列结果加起来再加上一步一步走的情况就能求解出此题了

def how_mach(k=3):  # 初始默认值为3number = 1  # 无论多少阶楼梯都有一步一步走的走法if k <= 0:  # 如果输入为非正数则返回return Falsehow_2 = k // 2  # 计算台阶有多少个2; 5个台阶则含有两个2, 6步台阶则含有三个2for i in range(1, how_2 + 1):  # 取多少个2,依次去1个‘2’、2个‘2’一直到how_2个‘2’# 调用上面的排列函数,用排列计算走法# 此时的m,n为(三)中的m,n# array()中第一个参数为公式中的n,第二个参数为公式中的m+n# i为n; k-2*i为m; 第二个参数m+n = i+k-2*i = k-i number += array(i, k - i)  return number

五、完整代码

# 计算排列n为上标,m为下标
def array(n, m):num = 1  # 初始化for i in range(1, n + 1):num *= m / im -= 1return num# 计算走法
def how_mach(k=3):  # 初始默认值为3number = 1  # 无论多少阶楼梯都有一步一步走的走法if k <= 0:  # 如果输入为非正数则返回return Falsehow_2 = k // 2  # k中有多少个‘2’for i in range(1, how_2 + 1):number += array(i, k - i)return numberprint(how_mach(10))
print(how_mach(5))
print(how_mach(7))

计算结果如下图:

​​​​​​​        ​​​​​​​

Python超级详细的上台阶楼梯问题,算法运行速度极快,内含计算排列的方法。问题:有n级台阶,每步可以走一级或两级,问有多少种不同的走法。k为传入的参数,默认值为3相关推荐

  1. 一个楼梯共有 n级台阶,每次可以走一级或者两级或者三级,问从第 0级台阶走到第 n级台阶一共有多少种方案。(java)

    import java.util.Scanner;public class _爬楼梯 {public static void main(String[] args) {System.out.print ...

  2. 斐波那契数列----有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第n级台阶有几种不同的走法?...

    问题:有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第n级台阶有几种不同的走法? 求解: /*** 有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第n级台阶有几种不同的走法?* n ...

  3. 有50级台阶,每次走一阶或两阶,有多少种走法?

    在网上看到这个问题,有人给出了代码,用的是求Fibonacci数列前n项和的原理,代码如下: int Fibonacci(int n) {int result[3] = {1, 2};if (num ...

  4. 题目3:一段楼梯共n级台阶,规定每一步只能跨一级或两级或三级。要等上第n级台阶共有几种走法?

    题目3:一段楼梯共n级台阶,规定每一步只能跨一级或两级或三级.要等上第n级台阶共有几种走法? 斐波那契数列问题:递归或动态规划均可解此类问题.跳台阶是典型应用之一. 思路:我们先从最后开始考虑,因为规 ...

  5. python参数默认值

    官方文档很详细啊! python官方文档 4.7.1. Default Argument Values¶ The default values are evaluated at the point o ...

  6. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  7. JavaScript中实现函数重载和参数默认值

    2019独角兽企业重金招聘Python工程师标准>>> 参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高. 举个例 ...

  8. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )

    文章目录 一.自定义闭包参数列表 1.定义一个自定义参数的闭包 2.定义多个自定义参数的闭包 3.为闭包参数指定默认值 二.完整代码示例 一.自定义闭包参数列表 如果要向 闭包 中 , 传递多个参数 ...

  9. ES5-5 参数默认值、递归、预编译、暗示全局变量

    1. 参数默认值 默认是undefined 形参可以有默认值,形参.实参哪个有值取哪个ES6,默认值属于ES6的内容,打印出的是符合人性化的结果 形参有默认值,形参.实参无法统一.无论实参传入有值还是 ...

最新文章

  1. SQL中的CASE WHEN用法
  2. python cmd命令 循环传参数_将参数从cmd传递给python脚本
  3. 微信视频号内容营销方法论
  4. 2008年秋季学期文兴小学四年级班主任工作计划
  5. CenOs6.3下博通BCM4313无线网卡驱动
  6. 如何避免学习linux必然会遇到的几个问题
  7. 哪些好的绘图软件和绘图工具?
  8. jcabanillas/yii2-inspinia-asset composert 安装失败
  9. 计网实验(一):IP子网划分
  10. fft算法的c语言实现,快速傅立叶变换(FFT)算法(蝶形算法)的C/C++源代码(zz)
  11. 考试周来临。。蓦然回首
  12. L3HSEC 2022秋季招新赛部分WP
  13. 解决”企业证书打包的ipa,点击app提示未受信任的企业级开发者“的问题
  14. 树莓派开启 wifi 热点
  15. Windows11 校园网连ftp登录上传作业失败
  16. 【算法】3 由招聘问题看随机算法
  17. 【C++】-- 友元
  18. SQL员工信息表题目及答案
  19. 如何快速算出一个数有多少个因子(c++)
  20. Python中除法取整以及求余数(模)的方式

热门文章

  1. C语言%lld、%llu无法正常输出比long long长整数小的数
  2. MySQL创建数据库表的语句和基础语句
  3. 利用vs将cs文件编译成dll文件
  4. 跨境12V汽车一键启动PKE无钥匙进入遥控远程启动系统改装
  5. Python贪吃蛇小游戏_完整源码免费分享
  6. Python含金量较高的证书以及学习困难盘点!
  7. matlab中矩阵的表示与简单操作
  8. Postman任务栏图标丢失
  9. python 爬取淘宝网课
  10. shell之cut命令