斐波那契数列

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

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;
    }
}

结束!

作者:HF

出处:https://www.cnblogs.com/haof31/p/18061332

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   go__Ahead  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示