使用递归算法递增自然数的伪代码就是这样(例如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中的递归函数?
答案 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可以为您提供帮助。它拥有您可能想要的所有替代方案,并且可以检查哪个是浏览器中最快的。