带有JavaScript中序列数组输出的斐波那契递归函数
嗨,我想用一个函数来返回斐波那契序列,这是一个数组,不是通常的第n个斐波那契数带有JavaScript中序列数组输出的斐波那契递归函数,javascript,recursion,fibonacci,Javascript,Recursion,Fibonacci,嗨,我想用一个函数来返回斐波那契序列,这是一个数组,不是通常的第n个斐波那契数 function fib(n,arr=[0]) { if (n===0||n===1) { arr.push(n) return arr; } let arr2 = fib(n-2); let arr1 = fib(n-1); arr1.push(arr2[arr2.length-1]+arr1[arr1.length-1]); return arr1; } 它工作得很好,但
function fib(n,arr=[0]) {
if (n===0||n===1) {
arr.push(n)
return arr;
}
let arr2 = fib(n-2);
let arr1 = fib(n-1);
arr1.push(arr2[arr2.length-1]+arr1[arr1.length-1]);
return arr1;
}
它工作得很好,但我对这里硬编码的arr=[0]不满意。我尝试将arr=[]放在数组中,但我最终将数组中应该存在的前0个条目排除在外
我相信有更好的方法来解决这个问题
附言:我想用递归方法解决这个问题,我知道它的指数时间复杂度很低,但我只是想练习我的递归编程技巧
let arr2 = fib(n-2);
let arr1 = fib(n-1);
你为每一步建立两个数组,所以你建立了n!数组。。。相反,只需使用一个递归调用,例如:
function fibonacci(n){
if(n <= 2)
return [0, 1].slice(0, n);
const res = fibonacci(n - 1);
res.push(res[res.length - 1] + res[res.length - 2])
return res;
}
函数斐波那契(n){
如果(n
var fib=函数(n){
如果(n==1){
返回[0,1];
}否则{
var-arr=fib(n-1);
arr.push(arr[arr.length-1]+arr[arr.length-2]);
返回arr;
}
};
console.log(fib(8));
不是我最自豪的代码,但具有数组+递归。在n>=2时工作正常(不会返回[1]
):
函数fibo(n){
var-ret=[1,1];
函数递归(n){
如果(!ret[n-1])递归(n-1);
//如果(!ret[n-2])递归(n-2);//事实上这不是必需的
ret[n]=ret[n-1]+ret[n-2];
}
如果(n>2)递归(n-1);
返回ret;
}
log(fibo(2.join());
console.log(fibo(15.join());
递归的fibonacci很容易,但是如何使它成为尾部递归的呢
如果您是Safari浏览器的快乐用户,其JS引擎已经实现了ES6尾部调用规范,那么您可以使用此代码段对其进行测试(警告:可能需要花费大量时间或耗尽内存!)
“严格使用”;
常量大=1e5;
让fibNaive=n=>{
if(nfib2(2,n,[0,1]);
设fib2=(k,n,a)=>k>=n?a:
fib2(k+1,n,a.concat(a[k-1]+a[k-2]);
console.log('cool',fibCool(BIG).slice(0,100))//有效!
该数组作为param有什么用?需要注意的是:避免硬编码值肯定会过度。硬编码值的问题是,它们会降低代码的可读性和灵活性,但1和0通常不会受到这些负面影响。fibonacci(1)
不是[0,1,1]
,您的代码返回错误的值我知道这种迭代方法。我使用递归只是为了练习。谢谢。为什么在这一行使用slice?返回[0,1]。slice(0,n);
在递归版本中?如果没有slice,它会给出完全相同的结果?返回[0,1]
@scaryguy-nope,用于fibonacci(1)
它会返回错误的结果你真的看了我的问题吗?当然我知道有一个很好的解决方案。但我想输出序列数组,而不是第n个斐波那契值的值。我偶然发现了我给出的这个旧答案,并意识到有些人只是在投反对票-生成它将是迭代的。事实上,这一行也以迭代方式构建列表,ret[n]=…
行可以是一个简单的ret.push(…)
,并将提供完全相同的结果。因此“递归”直接替换了一个简单的for
循环,这不是我引以为豪的。唯一的“加号”部分原因是它只构建一个列表。
function fibonacci(n){
const arr = [0, 1].slice(0 , n);
for(let i = 2; i < n; i++)
arr[i] = arr[i - 1] + arr[i - 2];
return arr;
}
let fib = n => fib2(2, n, [0, 1]);
let fib2 = (k, n, a) => k >= n ? a :
fib2(k + 1, n, a.concat(a[k - 1] + a[k - 2]));