首页 > 解决方案 > 无法弄清楚这个while循环的问题

问题描述

我正在尝试解决 FreeCodeCamp 的挑战。但我正在尝试以更实用的方式编写代码。所以挑战是将所有小于或等于给定数字的奇数斐波那契数相加。我试图避免 for 循环并尝试使用该主题中已接受的答案: 如何在没有尾调用优化的情况下用函数式编程替代方法替换 while 循环?

但我无法弄清楚为什么这不起作用。我错过了什么?如果答案太简单,我很抱歉。

const sumFibs = num => {
  const repeat = n => f => x => {
    let m = n

    while (m > num - x.length) {
      if (m === 0)
        return x

      else
        (m = m - 1, x = f(x))
    }
  }
  const gadzillionTimes = repeat(num)

  const add1 = x => {
    return x[0] + x[1] <= num ? [x[0] + x[1]].concat(x) : x;
  }

  const allFibonaci = gadzillionTimes(add1)([1, 1]);
  return allFibonaci.filter(x => x % 2 !== 0).reduce((a, b) => a + b);
}
sumFibs(4000000);

标签: javascriptwhile-loop

解决方案


斐波那契可以用递归函数声明性地描述。

function nthFib(n) {
  return n<2 ? n : nthFib(n-1) + nthFib(n-2)
}

n 个斐波那契的数组可以描述为计数数字的映射,其中每个元素是第 n 个斐波那契

function fibs(n) {
  return [ ...Array(n).keys() ].map(i => nthFib(i))
}

奇数斐波那契可以表示为过滤后的斐波那契(其中模 2 为 1)

const oddFibs = fibs(n).filter(f => f%2)

总和可以用声明式表示reduce()

const sum = oddFibs.reduce((acc, v) => acc + v, 0)

推荐阅读