当前位置: 首页 > 知识库问答 >
问题:

无法找出此while循环的问题

宇文飞翮
2023-03-14

我正在努力解决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);

共有2个答案

蔚琦
2023-03-14

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

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)
闻人志
2023-03-14

你的代码有很多地方,我想向你展示一种不用for循环就能完成同样的事情的方法。

function sumFibs(num) {
let a = 1;
let b = 1;
let sum = 1;

while (b <= num) {
if (b % 2 ==1) {
sum += b;}

let temp = b;
b = a + b;
a = temp;
  }
return sum;

不用担心初来乍到。通过尝试,你走上了正确的轨道,有时还有更短的方法来实现同样的目标。如果你有任何问题,请告诉我!

 类似资料:
  • 我正在为Codewars做一个kata,它将两个数字数组相对放置。“对手”数组的平均数总是大于“codewarrior”数组,并且两个数组的长度总是相同的。我需要做的是找到获得胜利的最有效方法(codewarrior[x] 在上面,我将两个数组从最小到最大排序。然后,我有一个大的while循环来迭代“codefighter or”数组,以及两个time循环和一个if语句,每次迭代“对手”数组时,都

  • 问题内容: 所以我在这里写了一些代码。它本来应该是一个猜谜游戏,但是无论我输入什么内容,它始终会在输出中显示“请输入数字…”,这与我输入的内容无关。基本上,如果“猜测”大于5,则他们猜到了数字。如果不是,那么他们还没有猜到这个数字。这就是游戏的前提。有人可以帮助我修复我的代码,因此无论如何它都不会输出相同的内容? 问题答案: 给你字符。因此,当您输入“ 1”时,它会给您其char值49。因此您不能

  • 问题内容: 我在用Java做一些小程序。我知道,如果我编写 程序,程序将在此循环中冻结。如果代码是这样的: 测试1: 编译器抛出错误: 我不知道这个错误存在。但是我知道为什么会抛出它。当然, 第6行无法访问 ,从而导致编译问题。然后,我对此进行了测试: 测试2: 由于某种原因 ,程序正常运行 (控制台先打印“开始”,然后冻结)。编译器无法检查内部, 并无法访问。确保我尝试过: 测试3: 与测试2相

  • 这段代码是为一个基本的杂货计算器的按钮。当我按下按钮时,一个输入对话框显示您在哪里输入您的商品价格。我遇到的问题是,我不知道如何获得循环,使输入对话框在输入后弹出。 我希望它总是回来,除非用户选择ok与nothing或cancel,在这种情况下,循环应该中断并填充剩余的框。使用当前的代码,我必须每次手动按下按钮来恢复对话框。我一直在玩不同的while条件和if语句,但我似乎无法让它发挥作用。我是一

  • while循环开始之前的语句没有打印,并且从1开始没有打印循环中的值。相反,它从一个随机的大int开始打印。

  • 问题内容: 我有一个while循环,应该捕获一个非整数输入,并要求用户重新输入一个整数。但是,它只是无限循环错误消息。有谁知道为什么不允许第二次扫描仪输入? 问题答案: 当您输入的令牌不是数字时,调用nextInt不会将扫描仪移到令牌之外。结果,它只是一遍又一遍地读取相同的令牌。 这是nextInt的文档:http : //download.oracle.com/javase/6/docs/api