递归、迭代(动态规划)解决斐波那契数列

本文介绍了如何使用迭代法和动态规划解决斐波那契数列问题,详细阐述了两种方法的时间复杂度和空间复杂度。通过Java代码展示了如何用两个变量优化迭代过程,将空间复杂度降低到常数级别。这种方法对于计算斐波那契数列的中后期项具有较高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)n≤39n\leq39n39

解决思路

  1. 递归,f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n1)+f(n2),自上而下求解并回溯到根节点,是一颗完全二叉树,所以时间复杂度O(2n2^n2n);空间复杂度为递归栈的大小,所以是O(n)。
  2. 迭代(动态规划):自下而上求解,记录下中间值,dp[0]=0,dp[1]=1,dp[2]=dp[1]+dp[0]…这样迭代到dp[n]即为所得解,时间复杂度O(n),空间复杂度O(n)。因为每轮迭代只和三个元素相关,我们可以用2个变量不断更新来替代数组,first=0,sum=1,sum=sum+first,first=sum-first…,优化后空间复杂度为O(1)。

Java实现

public class Solution {
    public int Fibonacci(int n) {
    //迭代法,数组记录中间值
//        int[] res = new int[40];
//        res[0]=0;
//        res[1]=1;
//        for(int i=2;i<=n;i++){
//            res[i]=res[i-1]+res[i-2];
//        }
//        return res[n];
		//直接用两个变量更新中间值
        int first = 0, sum = 1;
        for (int i = 2; i <= n; i++) {
            sum += first;
            first = sum - first;
        }
        return n == 0 ? first : sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值