JavaScript中的增量正确递归算法

时间:2018-06-07 18:07:58

标签: javascript algorithm math

使用递归算法递增自然数的伪代码就是这样(例如Steven S. Skiena的算法设计手册中的例子):

Increment(y)
 if y = 0 then return(1) else
  if (y mod 2) = 1 then
      return(2 * Increment(y/2))
  else return(y + 1)

我在这里用JavaScript实现了它:https://repl.it/@danielmai/IncrementalNaturalNumbers

function increment(y) {
  if(y == 0) return 1
  if(y % 2 == 1) {
    return 2 * increment(y / 2)
  }
  else return y + 1
}

它不适用于奇数。我发现JavaScript将数字向上舍入为0.5或更高,因此如果y为奇数,它将递增两次,即5 -> 7

我可以使用Math.floor(y/2)向下舍入,但我认为无论向上还是向下舍入,此功能都应该有效。所以我的问题是,有没有办法在不使用Math.floor的情况下纠正JS中的递归函数?

2 个答案:

答案 0 :(得分:2)

这与使用0.5或更高版本的javascript舍入数字无关。

你的增量函数是假设x / 2将返回一个整数,但在javascript中,这将给出奇数时的十进制数。因此,当执行increment(3)时,您递归调用increment(1.5)。当1.5%2 = 1.5时,它不是== 1所以它最终返回2.5。所以最后,你最终返回2.5 * 2 = 5.

这个函数确实适用于c ++,如果你使用整数,除法将修剪尾随小数。但是,在javascript的加法+,减法 - ,乘法*,除法/,幂**和模数%都将JavaScript中的数字视为双精度。只有二​​元运算符将JavaScript中的数字视为带符号的32位整数。

答案 1 :(得分:0)

Javascript没有整数除法,所以你不能只做5/2并期望它能给你2。

如果您正在寻找Math.floor的替代方案,this website可以为您提供帮助。它拥有您可能想要的所有替代方案,并且可以检查哪个是浏览器中最快的。