Contact me:

算法36 动规初探&&斐波那契&&尾递归

爬楼梯问题抽象出来就是斐波那契数列求和,
像这样递推公式,第一时间想到就是用递归

普通树形递归

一提交就爆栈,当n过大时压不住

    case 10: result = 89; 

    case 20: result = 10946; 

    case 45: result = 1836311903; 
class Solution {
public:
    int climbStairs(int n) {
        return f(n);
    }
    int f(int n){
        if (n==2) return 2;
        if (n==1) return 1;
        return f(n-1)+f(n-2);

    }
};

循环

空间复杂度O(1)

class Solution {
public:
    int climbStairs(int n) {
if (n<=2) return n;

        int x[n+1];
        x[1]=1;
        x[2]=2;

        for(int i=3;i<=n;i++){
            x[i]=x[i-1]+x[i-2];
        }
        return x[n];    }
    
};

先看一下线形递归

class Solution {
public:
    int climbStairs(int n) {
        return f(n,1,1);
    }

    int f(int n,int a,int b){
        if(n==1) return 1;
        
        return a+f(n-1,b,a+b);
    }
    
};

尾递归

空间复杂度O(1)

class Solution {
public:
    int climbStairs(int n) {
        return f(n,1,1);
    }

    int f(int n,int a,int b){
        if(n==1) return a;
        // int Sum_last=a+b;
        // int Sum_llast=b;
        return f(n-1,a+b,a);
    }
    
};
posted @ 2021-12-22 10:51  impwa  阅读(55)  评论(0编辑  收藏  举报