即使在javascript中使用有效的return语句,递归函数也会返回undefined

时间:2017-10-26 18:39:34

标签: javascript

这是一个问题,我需要返回一个只在数组中出现一次而其余元素出现两次的数字。使用二进制搜索我尽我所能,但我被困在第一个测试用例。当我能记录它时,我不明白为什么它会返回undefined。帮助我了解正在发生的事情。

function singleNonDuplicate(nums) {
  if(nums.length == 1) {
     console.log(nums[0]);
     return nums[0];
  } 

  if((nums[Math.floor(nums.length/2)] !== nums[Math.floor(nums.length/2) - 1]) && (nums[Math.floor(nums.length/2)] !==                                    nums[Math.floor(nums.length/2) + 1])) {
      return nums[Math.floor(nums.length/2)];
  } 


  if(Math.floor(nums.length/2) % 2  == 0) {
      if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) {
          singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2) - 1));
                      console.log('g');
      } else {
          singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 2));
                      console.log('g');

      }
  } else {
       if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) {
           console.log(nums.slice(Math.floor(nums.length/2) + 1));
          singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 1));
      } else {
          console.log('g');
          singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2)));
      }
  }
}

console.log(singleNonDuplicate([1,1,2]));

2 个答案:

答案 0 :(得分:0)

这可能有点偏离主题,但使用XOR有更好的方法来解决这类问题:

function appearsOnlyOnce(array) {
    var single = array[0];
    for (var i=1; i<array.length; i++) {
        single ^= array[i];
    }
    return single
}

答案 1 :(得分:0)

当你在你的函数中调用 singleNonDuplicate 时,你必须返回结果。

&#13;
&#13;
function singleNonDuplicate(nums) {
  if(nums.length == 1) {
     console.log(nums[0]);
     return nums[0];
  } 

  if((nums[Math.floor(nums.length/2)] !== nums[Math.floor(nums.length/2) - 1]) && (nums[Math.floor(nums.length/2)] !==                                    nums[Math.floor(nums.length/2) + 1])) {
      return nums[Math.floor(nums.length/2)];
  } 


  if(Math.floor(nums.length/2) % 2  == 0) {
      if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) {
          return singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2) - 1));
                      console.log('g');
      } else {
          return singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 2));
                      console.log('g');

      }
  } else {
       if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) {
           console.log(nums.slice(Math.floor(nums.length/2) + 1));
          return singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 1));
      } else {
          console.log('g');
          return singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2)));
      }
  }
}

console.log(singleNonDuplicate([1,1,2]));
&#13;
&#13;
&#13;