function fibonacci(n) {
if (n <= 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
let a = 0;
let b = 1;
let temp;
for (let i = 2; i <= n; i++) {
temp = a + b;
a = b;
b = temp;
}
return b;
}
}
// 测试用例
console.log(fibonacci(0)); // 输出 0
console.log(fibonacci(1)); // 输出 1
console.log(fibonacci(2)); // 输出 1
console.log(fibonacci(3)); // 输出 2
console.log(fibonacci(10)); // 输出 55
// --- 以下为可选的优化方案 ---
// 使用递归 (注意性能问题,n较大时会栈溢出)
function fibonacciRecursive(n) {
if (n <= 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}
}
// 使用记忆化递归 (优化递归性能)
const memo = {};
function fibonacciMemoization(n) {
if (n in memo) {
return memo[n];
}
if (n <= 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
memo[n] = fibonacciMemoization(n - 1) + fibonacciMemoization(n - 2);
return memo[n];
}
}
// 使用数组存储 (避免重复计算,性能更好)
function fibonacciArray(n) {
let fib = [0, 1];
for (let i = 2; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[n];
}
// 测试优化方案的性能 (需要引入性能测试库,例如benchmark.js)
// ...
代码解释和说明:
-
fibonacci(n)
(迭代法): 这是最推荐的写法,因为它简洁、高效,并且不会出现递归的栈溢出问题。 使用循环迭代计算斐波那契数列,避免了重复计算。 -
fibonacciRecursive(n)
(递归法): 递归的写法简洁易懂,但对于较大的n
值,会造成栈溢出,性能很差,不推荐在实际项目中使用。 -
fibonacciMemoization(n)
(记忆化递归): 通过memo
对象缓存已经计算过的值,避免重复计算,解决了递归的性能问题。 虽然比纯递归好很多,但仍然不如迭代法高效。 -
fibonacciArray(n)
(数组存储法): 使用数组存储计算结果,避免重复计算,性能也很好,与迭代法接近。
如何选择:
- 对于前端开发,绝大多数情况下,使用
fibonacci(n)
(迭代法) 就足够了,因为它性能好,代码简洁。 - 如果
n
的值非常大,可以考虑使用fibonacciArray(n)
(数组存储法)。 - 避免使用
fibonacciRecursive(n)
(纯递归),除非你非常清楚它的性能限制,并且n
的值很小。
这个例子提供了多种实现方式,并解释了它们的优缺点,方便你根据实际情况选择最合适的方案。 记住,在前端开发中,性能非常重要,尽量选择高效的算法。
标签:递归,性能,js,斐波,fibonacci,使用,那契,迭代法 From: https://www.cnblogs.com/ai888/p/18569731