从爬楼梯到斐波那契数列:解密数学之美

从爬楼梯到斐波那契数列:解密数学之美_第1张图片

题目描述

我们来看看力扣的一道经典问题70. 爬楼梯

从爬楼梯到斐波那契数列:解密数学之美_第2张图片

递归

假设n级台阶有climbStairs(n)种方法爬到楼梯顶。如果有n级台阶,如果第一次往上爬1级台阶,就会剩下n-1级台阶,这n-1级台阶就有climbStairs(n-1)种方法爬到楼梯顶;如果第一次往上爬2级台阶,就会剩下n-2级台阶,这n-2级台阶就有climbStairs(n-2)种方法爬到楼梯顶。所以有:climbStairs(n)=climbStairs(n-1)+climbStairs(n-2)。显然,climbStairs(1)=1,climbStairs(2)=2。

用递归就能轻松描述以上信息:

int climbStairs(int n) {
    if (n <= 2)
    {
        return n;
    }

    // f(n) = f(n-1) + f(n-2)
    return climbStairs(n-1) + climbStairs(n-2);
}

不过这样是过不了的,因为递归中存在大量重复的计算。
从爬楼梯到斐波那契数列:解密数学之美_第3张图片

循环

一种简单的方法是把递归改成循环。由climbStairs(n)=climbStairs(n-1)+climbStairs(n-2)可知,climbStairs(n)就是以1,2为前两项的斐波那契数列,从第三项开始,每一项都是前两项之和,所以只需要一项一项往后求就行了。

int climbStairs(int n) {
    if (n <= 2)
    {
        return n;
    }

    int a = 1;
    int b = 2;
    int c = 0;

    // 第3项会进一次循环
    while (n-- > 2)
    {
        c = a + b;
        a = b;
        b = c;
    }

    return c;
}

从爬楼梯到斐波那契数列:解密数学之美_第4张图片

其他思路

当然,我们也有一些其他思路。比如,可以使用矩阵构建一个递推关系,如:
在这里插入图片描述

从而得到:
从爬楼梯到斐波那契数列:解密数学之美_第5张图片
从而把问题转换成计算矩阵的幂的问题。

或者,直接使用特征根法计算出以上斐波那契数列的通项公式,即:
从爬楼梯到斐波那契数列:解密数学之美_第6张图片
从而直接使用通项公式求解。

总结

爬楼梯问题本质上就是斐波那契数列问题。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展,力扣,c语言)