Javascript powerofTwo算法解
下面是我检查数字是否是二的幂的算法。当我在测试用例“2”中运行这个算法时,答案是错误的。我想知道它为什么会这样Javascript powerofTwo算法解,javascript,Javascript,下面是我检查数字是否是二的幂的算法。当我在测试用例“2”中运行这个算法时,答案是错误的。我想知道它为什么会这样 var isPowerOfTwo = function(n) { if(n === 1){ console.log("i came here"); return true; } if(n === 0){ return false; } if(n%2 ==
var isPowerOfTwo = function(n) {
if(n === 1){
console.log("i came here");
return true;
}
if(n === 0){
return false;
}
if(n%2 === 0){
console.log(n);
n=n/2;
console.log(n);
isPowerOfTwo(n);
}
if(n%2 === 1){
return false;
}
};
我认为您只需要从函数的
n%2===0
分支返回一个实际值:
var isPowerOfTwo = function(n) {
if (n === 1) {
console.log("i came here");
return true;
}
else if (n === 0) {
return false;
}
else if (n % 2 === 0) {
console.log(n);
n = n / 2;
console.log(n);
return isPowerOfTwo(n);
}
else { // no need for an if here
return false;
}
};
请注意,在最后的else
中,我们不需要检查任何内容,因为我们已经确定该数字不是2
的倍数,因为1%2==1
“问题”是,在第三个if中,如果您更改了n的值并且没有返回任何值,那么它也将进入最后一个if。您没有返回递归调用,在测试完成之前,您也在更改
n
——如果n/2
解析为1
,则重新分配n
将导致底部if
语句运行。改为使用else
,不要重新分配n
,只需将n/2
传递给递归调用:
var isPowerOfTwo=函数(n){
如果(n==1)返回true;
如果(n==0)返回false;
if(n%2==0)返回isPowerOfTwo(n/2);
否则返回false;
};
console.log(isPowerOfTwo(2));
console.log(isPowerOfTwo(8));
console.log(isPowerOfTwo(6))
如前所述,在第3条if
语句中不返回任何值,因此对于大于1的值,总是会得到false
,因为它也会执行第4条语句
除了给出的答案之外,这里还有一个有趣的解决方案(最初是by),我对其进行了扩展,以处理非数字作为值传递的情况
试着投一个号码
const isPowerOfTwo=n=>Number(n).toString(2).split('1')。length==2
console.log(isPowerOfTwo(“”));
console.log(isPowerOfTwo('0');
console.log(isPowerOfTwo('1');
console.log(isPowerOfTwo('2'));
console.log(isPowerOfTwo(2));
console.log(isPowerOfTwo(8));
console.log(isPowerOfTwo(6))代码>Javascript一行程序解决方案
对于任何2的幂(n&n-1)将返回0。简单位运算符
isPowerOfTwo = n => !(n & n - 1)
上述函数将为0返回true,这不是2的幂。为此
isPowerOfTwo = n => (n != 0) && !(n & n - 1)
递归适用于新手:pconst isPowerOfTwo=n=>n.toString(1)。拆分('1')。长度===2
@JaromandaX应该是toString(2)
,因为“基数”不能是1。。。而且它不是傻瓜式的,因为传递字符串'1'
会给出true
(这是正常的),但是'2'
会给出false
(这是不正常的),所以要么所有字符串都会失败,或作为字符串的任何数字
产生与数字
does@JaromandaX例如,const isPowerOfTwo=n=>typeof n==='number'和&n.toString(2)。拆分('1')。长度===2
。。。或者const isPowerOfTwo=n=>Number(n).toString(2).split('1').length==2
@JaromandaX这仍然是一个有趣的解决方案,所以如果我是你,我会发布它:)对不起,打字错误,是toString(2)