Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有JavaScript中序列数组输出的斐波那契递归函数_Javascript_Recursion_Fibonacci - Fatal编程技术网

带有JavaScript中序列数组输出的斐波那契递归函数

带有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; } 它工作得很好,但

嗨,我想用一个函数来返回斐波那契序列,这是一个数组,不是通常的第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;
}
它工作得很好,但我对这里硬编码的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]));