javascript - 无法弄清楚这个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);
解决方案
斐波那契可以用递归函数声明性地描述。
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)
推荐阅读
- javascript - 对齐一个简单的列表,保持圆形
- python - 在 MAC OS 上安装 Python 3.9.1 但仍然说 Python 版本是 2.7
- c - Fscanf 从文件 C 的中间读取
- javascript - 动作发布 redux thunk
- windows - 在 VBScript 中只使用 FileSystemObject,如何确定操作系统的处理器架构?
- syntax-error - 脚本错误:@esx_gangs/server.lue:99:尝试索引一个 nil 值(字段“?”)
- html - CSS 创建带有复选标记的头像图像(已验证)
- c++ - 内存位置错误的 C++ 无效参数
- python - 如何在python中将输入列表转换为字符串
- java - 如何在java中添加超时和轮询代码?