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

【LeetCode题解(C语言)】爬楼梯_第1张图片

这是一个数学题,设这个函数是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个台阶的方法的数量:

        【LeetCode题解(C语言)】爬楼梯_第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));
}

 

你可能感兴趣的:(【LeetCode题解(C语言)】爬楼梯)