509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
题目来源:力扣(LeetCode)
递归思路
能否写出:能写出。
时间:10多分钟
思路:
斐波那契数列是一个非常经典的递归题目。用来入门递归非常好。记得我第一次使用递归就是斐波那契数列和叠盘子。
F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2),其中 n > 1。
// 仅是我的思路代码,leetcode上大神更厉害 class Solution { public int fib(int n) { if (n < 2) { return n == 1 ? 1 : 0; } return fib(n - 1) + fib(n - 2); } }
时间复杂度: O(2^n),其中 n 是斐波那契数列的索引。每次递归调用会产生两个分支,指数级地增长。
空间复杂度:O(n),递归调用的栈空间取决于递归深度,最坏情况下需要存储 n 个函数调用的信息。
递归解法在计算斐波那契数列时存在重复计算的问题,导致时间复杂度指数级增长。因此,尽管递归是一种直观的解法,但在实际应用中,为了获得更高效的计算,可以采用迭代、动态规划或记忆化递归等其他方法来计算斐波那契数列。
其他思路:
虽然是动态规划
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]; } }
时间复杂度:O(n),需要计算第 0 到第 n
个斐波那契数,每个斐波那契数的计算都需要常数时间。
空间复杂度:O(n),需要一个长度为 n+1
的数组来存储中间结果。