【问题标题】:Trying to find LCM using recursion...I get infinity尝试使用递归查找 LCM ......我得到无穷大
【发布时间】:2021-09-22 18:31:59
【问题描述】:

编辑** 阅读我的问题,我现在意识到为什么我得到无穷大,num2 和 num1 永远不会相等,因为 num2 永远是一个更大的数字。是否可以使用递归来解决这个问题,还是使用循环之类的东西更好?我能够解决这个问题,只是对递归感到好奇。

如果两个数字相同,我应该找到 LCM 并希望将其退回。如果它们不相等,我将再次调用我的函数,但每次都增加其原始值。

 let leastCommonMultiple = (num1, num2) => {
    if (num1 === num2) return num1;

    return leastCommonMultiple(num1 + num1, num2 + num2)
}

console.log(leastCommonMultiple(4, 6)); // 12
console.log(leastCommonMultiple(3, 5)); // 15
console.log(leastCommonMultiple(2, 10)); // 10

【问题讨论】:

  • 这个算法不起作用。你从哪里得到它和/或为什么你认为它会产生 LCM?>
  • 我知道它不起作用。我写的。我对为什么它不起作用的理解是否正确?我还尝试设置第三个参数,并在每次调用该函数时递增 1。我的基本情况是,当 % num1 && n % num2 等于 0 时返回 n。
  • 您可以轻松编写递归 GCD 函数。一旦你有了它,你就可以写const lcm = (a, b) => a / gcd (a, b) * b
  • 我认为 RBarryYoung 指出这不仅仅是一个实施问题。由于许多原因,它从根本上被破坏了。
  • 好的,所以我需要一个辅助函数?我不能只用一个函数来做到这一点?

标签: javascript recursion


【解决方案1】:

你当然可以写一个递归版本。这是一个特别不优雅和低效的版本:

const lcm = (a, b, x = a, y = b) =>
  x == y 
    ? x 
    : x + a > y + b 
      ? lcm (a, b, x, y + b) 
      : lcm (a, b, x + a, y)

console .log (lcm (660, 126)) //=> 13860

我们分别使用xy 作为ab 的连续倍数,增加较小的一个,直到它至少与另一个一样大。当它们相等时,您就达到了 LCM。

稍加考虑,我相信我们可以通过乘以正确的因素来提高效率。但是,当 GCD 如此简单高效地执行时,我不确定是否有任何充分的理由。

更新

这是一个更高效的版本:

const lcm = (a, b, x = a, y = b) =>
  x == y 
    ? x 
    : x > y 
      ? lcm (a, b, x, b * Math.ceil (x / b)) 
      : lcm (a, b, a * Math.ceil (y / a), y)

console .log (lcm (660, 126)) //=> 13860

这使用了一些类似于 GCD 的模运算符,它找到一个值的第一个倍数,至少与另一个值一样大。这应该是相对有效的。

更新 2

为了展示三元组是如何工作的,这是一个等效的命令式版本:

const lcm = (a, b, x = a, y = b) => {
  if (x == y) {
    return x
  } else {
    if (x > y) {
      return lcm (a, b, x, b * Math.ceil (x / b)) 
    } else {
      return lcm (a, b, a * Math.ceil (y / a), y)
    }
  }
}

console .log (lcm (660, 126)) //=> 13860

【讨论】:

  • 谢谢,我得研究一下。我对js很陌生,甚至不知道三元是如何工作的,所以我会参考MDN。
  • condition ? consequent : alternativeif (condition) {return consequent} else {return alternative} 的工作方式相同,只是作为一个普通表达式而不是作为控制流构造语句ifreturn 语句的组合。仅当您可以在三个位置中的每一个中放置简单的表达式时,它才有效,但如果可以,它通常会更简洁。
猜你喜欢
  • 2020-05-09
  • 2020-07-04
  • 2019-08-26
  • 1970-01-01
  • 2022-08-12
  • 2015-05-03
  • 2020-05-28
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多