Python 爬楼梯问题--有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?

Python爬楼梯问题:有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?

总共n步台阶(先假设n>3),f(n)表示n步台阶的走法总数
1、第一步如果是只走1步台阶,剩下的n-1步台阶怎么走(多少种走法)就只和n-1步台阶有关,f(n-1)
2、第一步如果是走2步台阶,剩下的n-2步台阶怎么走(多少种走法)就只和n-2步台阶有关,f(n-2)
3、第一步如果是只走3步,剩下的n-3步台阶怎么走(多少种走法)就只和n-3步台阶有关,f(n-3)

高中数学的排列:迈开步子的第一步有3种走法,再去算1、2、3种走法的总数加起来就是总的走法数。

第一步走1阶台阶,2阶台阶,3阶台阶,各是一种走法,1、2、3加起来就是走法的总数了

fn(n)=fn(n-1)+fn(n-2)+f(n-3) # 这种款式的表达式是不是类似斐波那契数列?
(斐波那契数列定义:0、1、1、2、3、5、8.。。。f(n)=f(n-1)+f(n-2)

假设总共3步台阶:1、1、1, 2、1, 3, 1、2总共四种走法
1-1-1
1-2
2-1
3

1、第一步走1步,走完所有台阶的走法,只与剩下的2步台阶有多少种走法有关了,fn(3)=fn(2),总共2中走法
2、第一步走2步,走完所有台阶的走法,只与剩下的1步台阶有多少种走法有关了,fn(3)=fn(1),总共1中走法
3、第一步走3步,走完所有台阶的走法,只与剩下的0步台阶有多少种走法有关了,fn(3)=fn(0),总共1种走法 。这里不要纠结fn(0)=1
fn(3)=2+1+1=4

所以这个等式成立不啊?!
fn(3)=fn(3-1)+fn(3-2)+f(3-3)

==>fn(3) = fn(2)+fn(1)+f(0)
==>fn(3) = fn(1)+fn(0)+fn(1)+fn(0)

这么理顺下来,就是归并排序用到的分而治之的思想,分到最细,1步阶梯只有1种走法,但因为递归运算要设置条件fn(0)=1,才能递归算下去

from functools import lru_cache #python函数工具包里的缓存模块
@lru_cache(1024)
def sum_stairs_recursion(sum):
    """
    有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?
    递归算法
    不加缓存模块sum>100,一般电脑就很难算出来了,试了下n=30,i5四核跑了50秒
    :param sum:传入楼梯数 int 
    :return: int 
    """
    if sum==0:
        return 1
    elif sum <0:
        return 0
    return sum_stairs_recursion(sum-1)+sum_stairs_recursion(sum-2)+sum_stairs_recursion(sum-3)
    
def sum_stairs_Fibo(sum):
    """
    非递归算法,斐波那契数列
    台阶数:1、2、3、4、5、6
    走法数:1、2、4、7、13、24
    :param sum:
    :return:
    """
    a,b,c = 1,2,4
    while sum-1>0:
        a,b,c = b,c,a+b+c
        sum -= 1
    return a

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值