Javascript powerofTwo算法解

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 ==

下面是我检查数字是否是二的幂的算法。当我在测试用例“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)


递归适用于新手:p
const 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)