Loading

斐波那契数列

作为递归入门算法,我却仅仅学习了这题的递归解法,惭愧惭愧。今天来总结一下这道题的所有解法

1、递归解法

class Solution {
public:
    int Fibonacci(int n) {      //每3个一组,整成动态二维数组
        // write code here
        if(n<=2){
            return 1;
        }else {
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }
};

2.1非递归解法一

考虑到递归时间复杂度太高,对于输入的数较大时,会引起很多不必要的计算,所以我们可以考虑使用一个数组来记录一下计算的值,这样第二次就可以直接访问到答案了;

class Solution {
    public int fib(int n) {
        if(n < 2)
            return n;
        int dp[] = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for(int i=2;i<=n;i++){
            dp[i] = (dp[i-1] + dp[i-2]);
        }
        return dp[n];
    }
}

这种解法虽然时间复杂度变低了,但是引入了数组,空间复杂度变大;

2.2非递归解法二

思考一下,这个问题每次计算都是f(n) = f(n-1) + f(n-2); 那么上面那种解法先算出数据再放到数组里,那么真的需要所有数据都要存储吗? 不是的,我们计算也就只需要前两个数,所以我们只定义两个变量用来存储前面两个数就行了,边计算边存储!

class Solution {
    public int fib(int n) {
        int num1 = 0;		//暂时先用来存储f(0),后来用于存储f(n-2)
		int num2 = 1;		//暂时先用来存储f(1), 后来用于存储f(n-1)
		int sum;			//用来存储f(n)
		int i = 2;			//遍历循环遍历
		if(n < 2)
            return n;
		while((i++)<=n){
			sum = num1 + num2;
			num1 = num2;
			num2 = sum;
		}
		return sum;
    }
}

结束!

posted @ 2024-03-08 16:41  go__Ahead  阅读(9)  评论(0编辑  收藏  举报