使用地图打印Fibonacci系列或在javascript中进行精简

时间:2018-09-21 17:19:06

标签: javascript arrays higher-order-functions

我想使用Java中的map()或reduce()函数来打印Fibonacci系列。我无法在网上找到任何东西。我不太确定map()中的状况如何。

我基本上是写

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

5 个答案:

答案 0 :(得分:3)

使用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()并不是特别合适,因为您没有自然的方式来访问较早的状态。

答案 1 :(得分:0)

您可以使用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; }

答案 2 :(得分:0)

下面是您的问题的代码。 “ 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];
    });  
}

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

答案 3 :(得分:0)

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;
}

答案 4 :(得分:0)

我为我的学生写的一个野蛮的班轮例子:

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));