递归学习:台阶问题+python代码

问题介绍:

  1. 假设一段楼梯共n个台阶,小明一步最多能上3 个台阶,编写递归函数计算小明上这段楼梯一共有多少种方法。
  2. 假设一段楼梯共n个台阶,小明一步最多能上3 个台阶,编写程序列出小明上这段楼梯的所有方法

先解决第一个问题:

问题分析:

每一步可能的情况有一个台阶,两个台阶,三个台阶,将台阶总数设为n,方法数设为step(n),可以得到,迈一个台阶后方法数为step(n-1),两个台阶后为step(n-2),三个台阶为step(n-3),则可得step(n)=step(n-1)+step(n-2)+step(n-3),发现这是一个往下递归的过程,最终当n=3,2,1时分别可直接数出有4,2,1种方法。

python代码:

    def step(n):
        if n==1:
            return 1;
        if n==2:
            return 2;
        if n==3:
            return 4;
        sum=step(n-1)+step(n-2)+step(n-3);
        return sum;

接下来解决第二个问题:

问题分析:

同样按照第一个问题的思路,对于n个台阶,则在原有的步数列表基础上分别产生三个子列表,子列表分别添加步数1,2,3,然后将n-1,n-2,n-3送入下一级函数进行递归,最终进行到n=1或2或3的情况,穷举出其可能的步数添加,即可解决问题。只不过关键在于代码的细节问题,即子列表的生成:分别计算n,n-1,n-2,n-3个台阶方法数(这里第一个问题的函数则可派上用场),同样记为step(x),将n-1送入下一级函数之前,在原有列表基础上对对应的step(n-1)个列表在后面添加“1”,n-2,n-3同理。

python代码:

    def step(n):
        if n==1:
            return 1;
        if n==2:
            return 2;
        if n==3:
            return 4;
        sum=step(n-1)+step(n-2)+step(n-3);
        return sum;
    
    def way(n,list,i=0):
        if n==1:
            list[i].append(1);
            return;
        if n==2:
            list[i].append(2);
            list[i+1].extend([1,1]);
            return;
        if n==3:
            list[i].append(3);
            list[i+1].extend([1,1,1]);
            list[i+2].extend([1,2]);
            list[i+3].extend([2,1]);
            return;
        for j in range(i,step(n-1)):
            list[j].append(1);
        way(n-1,list,i);
        i=i+step(n-1);
        for j in range(i,i+step(n-2)):
            list[j].append(2);
        way(n-2,list,i);
        i=i+step(n-2);
        for j in range(i,i+step(n-3)):
            list[j].append(3);
        way(n-3,list,i);
    def way_achieve(n,list):
        list=[];
        for j in range(step(n)):
            list.append([]);
        way(n,list);
        

使用示例:

计算100级台阶:

way_achieve(100,p)   #p为接收列表

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值