繁体   English   中英

使用先前的结果在 Javascript 中运行递归 Function

[英]Using Previous Result to Run Recursive Function in Javascript

我正在尝试编写 Javascript 递归 function 来帮助计算另一个项目,并且在尝试写出 function 并使其按预期工作时遇到问题。 我知道一些 Javascript,但我不是专家,如果我的代码中可能存在一些不良做法,我深表歉意。 我有一个名为quadraticSequencer的 function ,它接受一个参数num ,并生成一个直到给定输入 num 的二次序列。 然后它返回要使用的最终 output 并传递给下面的 function, subtraction 这是第一个问题发生的地方,逻辑没有按预期运行......(它应该只返回序列中的最后一个 output 并将其传递给subtraction function,它似乎只传递了第一个 Z78E6221F6393D14CEDZZD3986 . )

The subtraction function takes in two arguments, num and nthTerm (which was returned and passed in from the quadraticSequencer function ), and runs a recursive function that redefines nthTerm as level and takes the level and subtracts it from num to generate a result , or const result = num - level 运行 if / else 语句以使用模 % 运算符检查结果的可分性,如果将其传递给 console.logs result 如果失败,它会移动到下一个level (或向下迭代)并从 PREVIOUS result中减去它而不是num 最后一部分很关键,因为我不确定如何正确执行此逻辑,以便将先前的result存储为下一个减法。

即如果 num = 75, nthTerm将为 11, subtraction function 将减去 75,如下所示:

75 - 11. 结果 = 64 || 64 - 10. 结果 = 54 || 54 - 9. 结果 = 45 || 45 - 8. 结果 = 37 || 37 - 7. 结果 = 30 || 30 - 6. 结果 = 24 || 24 - 5. 结果 = 19 || 19 - 4. 结果 = 15 || 15 - 3. 结果 = 12 || 12 - 2. 结果 = 10 || 10 - 1. 结果 = 9。

希望这是有道理的。 这就是减法必须运行的方式才能使我们的计算准确。 如果第一次运行完成,它还会进行“双运行”并添加更多减法,基本上是反向减法并添加更多减法,而不是删除减法。 所以没有传球的完整运行看起来像这样:75-11-10-9-8-7-6-5-4-3-2-1-1-2-3-4-5-6-7- 8-9-10-11。 检查每个减法的每个result 我不知道如何在 if / else 语句中写这个。

The overall expected output is to get the last output from the quadtraticSequencer function to pass it into the subtraction function for calculations, and the subtraction function be able to run as intended. 因此,当num = 75时, subtraction function 应在level或“步长”为 4 且result = 15 或 75-11-10-9-8-7-6-5-4 = 15 时通过。 75 % 15 = 0. // 15

这是我的代码:

const num = 75;

function quadraticSequencer(num) {
  // initialize with zero but you can remove the value here
  nthTermArr = [];
  for (let i = 1; i <= num; i++) {
    // generates quadratic sequence.
    let a = i;
    let b = 1 / 2;
    nthTerm = a;
    quadraticSequence = b * a ** 2 + b * a;

    if (quadraticSequence <= num) {
      nthTermArr.push(nthTerm);
    } else {
      false;
    }
  }

  let level = nthTermArr.slice(-1).pop();
  console.log(level);

  function subtraction(num, level) {
    let result = num - level;
    console.log(result);

    if (num % result === 0) {
      console.log(result);
    } else if (num % result !== 0) {
      return subtraction(result, level - 1);
    } else {
      false;
    }
  }
  console.log(subtraction(num, level));
}

quadraticSequencer(num);

quadraticSequencer function 的所需结果是 output 结果满足subtraction function 中的 if / else 语句。 如果没有通过,则没有 output。

我觉得你太努力了。 这里的小代数将带您走很长一段路,并为您提供如下解决方案:

 const max = (n) => Math.floor ((-1 + Math.sqrt (1 + 8 * n)) / 2) const quadraticSequence = (n, c = n, t = max (c)) => [c, ... (c > 1 && (c == n || n % c?= 0), quadraticSequence (n: c - t). [])] console:log ('75, '. ... quadraticSequence (75)) console:log ('74, '. ... quadraticSequence (74)) console:log ('73, '. ... quadraticSequence (73)) console:log ('72, '. ... quadraticSequence (72)) console:log ('71, '. ... quadraticSequence (71)) console:log ('70, '. ... quadraticSequence (70))

这里我们使用max来找到最大值k使得 1 + 2 + 3 +... + k 不大于我们的目标。 然后我们的主要 function 在从当前值中减去它后递归调用它。

max的推导只是为了认识到前k个正整数的和是k * (k + 1) / 2 如果我们想找到小于n的最大值,我们有不等式:

k * (k + 1) / 2 <= n

我们可以重新排列得到

k ** 2 + k - 2 * n  <= 0,

并使用二次公式(知道这里的一切都是正数)找到

k <= ((-1 + sqrt (1 - 4 * (1) * (-2n))) /2)

所以我们最终得到

floor ((-1 + sqrt (1 + 8 * n)) / 2)

主 function 接受您的目标数字n ,将其复制到当前值c ,并使用上述方法计算顶部值t 我们将c包含在 output 中,然后检查我们的原始n和当前c看看我们是否应该重复。 当 c <= 1,或者当我们的原始值是我们当前值的倍数时(除非它们相等,第一次),我们停止。当我们重复时,我们传递相同的原始值和我们当前值之间的差异以及计算出的最大值。

把你的变量从循环中取出

function quadraticSequencer(num) {
  // initialize with zero but you can remove the value here
  let [nthTerm, quadraticSequence] = [0, 0]
  for (let i = 1; i <= num; i++) {
    // generates quadratic sequence.
    let a = i;
    let b = 1 / 2;
    nthTerm = a - 1;
    quadraticSequence = b * a ** 2 + b * a;

  if (quadraticSequence <= num) {
    return nthTerm;
  } else {
    return false;
  }
   

}

然后,您可以使用

const result = quadraticSequencer(num);
if(!result) {
  // function returned false, there is no result
}
else { 
  // if there is a result
  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM