掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。
该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
eg1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
eg2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
eg3:
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
二、思路分析
斐波那契数列,又称为兔子数列。
例如: 1, 1, 2, 3, 5, 8, 13, 21
三、解题代码
- 解法一:
var fib = function(n) {
if (n <= 2) return 1
return fib(n - 1) + fib(n - 2)
};
解法一存在的问题:会存在大量的重复计算,以及计算产生的堆栈数据过多
2. 解法二:
var fib = function(n, prev = 1, next = 1) {
if (n === 0) return 0
if (n <= 1) return prev
return fib(n - 1, next, prev + next)
};
解法二通过尾调用的方法只需要保存内层函数调用记录,大大节省了内存
四、总结
- 递归容易产生大量的调用栈记录,导致堆栈溢出。
- 每天一练,持续学习