在 javascript 中使用 map 或 reduce 打印斐波那契数列

Print Fibonacci Series using map or reduce in javascript

我想在 Javascript 中使用 map() 或 reduce() 函数打印斐波那契数列。我无法在网上找到任何东西。我不太确定我在 map() 中的情况。

基本在写

fib(n){
return new Array(n-1).fill(1).map((_,i) => *This is where I am confused* ) ;
}

您可以使用 Array.from 和两个起始值来映射它以获得系列。

function fib(length) {
    return Array.from({ length }, ((a, b) => _ => ([b, a] = [a + b, b, a])[2])(0, 1));
}

console.log(fib(10));
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用 reduce() 做到这一点相对容易,只需检查索引并采取相应措施即可:

function fib(n){
  return new Array(n).fill(1).reduce((arr, _ ,i) => {
      arr.push((i <= 1) ? i : arr[i-2] + arr[i-1])
      return arr
  },[]) ;
}
console.log(fib(10))

map() 不是特别合适,因为您没有访问早期状态的自然方式。

下面是您的问题的代码。 "elem"是当前当前值,"index"是当前索引,"currentArray"是数组实例。

fibonacci = (n)=>{
    return new Array(n).fill(0).map((elem,index, currentArray)=>{
        if(index === 0){
            currentArray[index] = 0;
        }else if(index === 1){
            currentArray[index] = 1;
        }else{
            currentArray[index] = currentArray[index-2]+currentArray[index-1];
        }
        return currentArray[index];
    });  
}

您可以看到,对于每一步,我们都使用当前索引修改数组元素,然后 return 当前索引处的元素。最终迭代完成后得到斐波那契数列数组

I've tried in my concole it works fine你可以关注这个。希望它能帮助您从 google 控制台尝试 运行。

function Fibonacci(n) {
    var f = [];
    for (var c = 0; c < n; ++c) {
        f.push((c < 2) ? c : f[c-1] + f[c-2]);
    }
    return f;
}

我为我的学生写的一个野蛮的单行示例:

const fiboReduce = level => new Array(Math.max(0, ++level)).fill(0).reduce((acc, val, index) => [...acc, ...((index > 1 && [acc[--index] + acc[--index]]) || [])], [0, ...((level > 1 && [1]) || [])]);

console.log(fiboReduce(20));

长版导演剪辑版(请原谅我的法语):

const fiboReduceExplained = level => {
 // on force le rang minimum à 1 en utilisant Math.max
 // on ajoute 1 pour bien calculer jusqu'au rang souhaité
 // on créé un tableau vide qui a pour longueur le rang souhaité
 let array = new Array(Math.max(1, ++level));
 array.fill(0); // on le blinde de 0 jusqu'au bout
 let startValue = [0]; // valeur de départ
 if(level > 1) startValue.push(1); // cas particulier pour fibo(0)
 let fibo = array.reduce((acc, val, index) => { // reduce !
  if(index > 1) { // index strictement supérieur à un, on est sorti des valeurs de départ
   let next = acc[index - 1] + acc[index - 2]; // on calcule le terme suivant 
   acc.push(next); // et on l'ajoute au tableau
  }
  return acc; // on retourne le tableau pour la boucle suivante
 }, startValue); // valeur de départ du reduce
 return fibo; // on retourne le résultat
}

console.log(fiboReduceExplained(20));

减少并连接

const fib = (n) => {

    [...Array(n)].reduce(
    (acc,val,i) => acc.concat(i > 1 ? acc[i-1]+ acc[n-2] : i),
    [])
    
    }

fib(10)