【LeetCode题解(C语言)】爬楼梯

这是一个数学题,设这个函数是f(n),f(1)=1,f(2)=2,f(3)=3,下面开始推导f(n):

        f(4)=5,为什么呢?要上4个台阶,在上3个台阶的基础上再上一个台阶即可,所以至少有f(3)种方法,即:1+1+1+1,1+2+1,2+1+1。在这f(3)种方法中,有2种方法末尾以两个1结尾,那么这两个1阶可以合成一个2阶,便新生成了2种方法(1+1+2,2+2),所以f(4)=3+2=5。

        f(5)=8,为什么呢?同样的道理,要上5个台阶,在上4个台阶的基础上再上一个台阶即可,所以至少有f(4)种方法,即:1+1+1+1+1,1+2+1+1,2+1+1+1,1+1+2+1,2+2+1。在这f(4)种方法中,有3种方法末尾以两个1结尾,那么这两个1阶可以合成一个2阶,便新生成了3种方法(1+1+1+2,1+2+2,2+1+2),所以f(4)=5+3=8。

        观察可得,新生成的方法的数量等于上n-2个台阶的方法的数量:

        

        于是得到以下关系式:f(n)=f(n-1)+f(n-2),这是斐波那契数列的类型。

        通过高中的知识可以推导斐波那契数列的通项公式为:

        

        这里f(1)=1,f(2)=2,f(3)=3,所以这里的f(n)相当于{an}去掉了第一项,所以f(n)=a n+1。

        C语言代码如下:

int climbStairs(int n){
    return 1 / sqrt(5.0) * (pow(0.5 * (1 + sqrt(5.0)), n + 1) - pow(0.5 * (1 - sqrt(5.0)), n + 1));
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值