递归函数无响应

No response from recursive function

我想创建一个函数来确定数字是否相同或回文。如果给定数字是回文或相同则 return 2 否则如果它不是回文或相同那么我需要通过将给定数字增加 1 来检查它两次。之后如果它是回文或相同则 return 1. 如果没有找到回文或相同的数字,则 return 0. 当我将数字作为 11211 时,我编写的函数给出了准确的结果,但如果我输入 1122 或其他,该函数不显示任何响应随机值。请帮我找出我的功能错误在哪里。

function sameOrPalindrome(num) {
  var c = 0;
  var al = 0;
  var normalArray = num.toString().split("");
  var revArray = num.toString().split("").reverse();
  for (var i = 0; i < normalArray.length; i++) {
    if (normalArray[i] != revArray[i]) {
      c++;
    }
  }
  if (c == 0) {
    return 2;
  } else {
    num++;
    al = sameOrPalindrome(num);
    if (al == 2) {
      return 1;
    } else {
      num++;
      al = sameOrPalindrome(num);
      if (al == 2) {
        return 1;
      }
    }
  }
  return 0;
}

console.log("1233",sameOrPalindrome(1233))

这是我对这个问题的解决方案:

function reversedNum(num) {
    return (
    parseFloat(
      num
        .toString()
        .split('')
        .reverse()
        .join('')
      ) * Math.sign(num)
      )                 
     }
    


      function sameOrPalindrome(num) {
        if (num === reversedNum(num)) {
          return 2;
        } else {
          num++;
          if (num === reversedNum(num)) {
            return 1;
          } else {
            num++;
            if (num === reversedNum(num)) {
              return 1;
            }
          }
        }
        return 0;
      }

      console.log("1233",sameOrPalindrome(1233))

问题:我假设如果回文测试第一次为真,那么 return 2. 如果不是,请尝试递增 1 并再次测试回文。 if true return 1 else 尝试最后一次递增并检查回文 if true return 1 else 0.

先将字符串存入数组再arr.reverse().join("")比较

  let arr=num.toString().split("");
  if(num.toString() == arr.reverse().join(""))

function sameOrPalindrome(num, times) {
  let arr = num.toString().split("");
  if (num.toString() == arr.reverse().join("")) {
    if (times == 3) return 2
    else return 1;
  } else if (times > 0) {
    num++; times--;
    return sameOrPalindrome(num, times);
  } else return 0
}
console.log(sameOrPalindrome(123321, 3));
console.log(sameOrPalindrome(223321, 3));
console.log(sameOrPalindrome(323321, 3));

可能没有使用递归 - 我认为你的函数循环

const allEqual = arr => arr.every( v => v === arr[0] )
const sameOrPalin = num => {
  const str = String(num);
  let arr = str.split("")
  if (allEqual(arr)) return 2
  arr.reverse();
  if (arr.join("") === str) return 1;
  return 0
};
console.log("1111",sameOrPalin(1111));
console.log("2111",sameOrPalin(2111));
console.log("2112",sameOrPalin(2112));
console.log("1234",sameOrPalin(1234));

for (let i = 2111; i<=2113; i++) console.log(i,sameOrPalin(i));

function check_palindrom(num){
    var c1 = 0;
    var normalArray = num.toString().split("");
    var revArray = num.toString().split("").reverse();
    for (var i = 0; i < normalArray.length; i++) {
        if (normalArray[i] == revArray[i]) {
            c1++;
        }
    }
    if(c1==0){
      return 2;
    }else{
      return 1;
    }
}//check_palindrom

function my_fun_check_palindrome(mynum){
    //console.log(mynum);
    var num = mynum;
    var c2 = 0;
    var al = 0;
    var normalArray = mynum.toString().split("");
    var revArray = mynum.toString().split("").reverse();
    for (var j = 0; j < normalArray.length; j++) {
        if (normalArray[j] == revArray[j]) {
            c2++;
        }
    }
    if(c2==0){
      console.log('Number is palindrome. Return Value :'+ 2);
    }
    if(1){
      console.log('checking again with incremeting value my one');
      num = parseInt(num)+1;
      al = check_palindrom(num);
      if(al==2){
        console.log('Number is palindrome. Return Value :'+ 1);
      }else{
        console.log('Number is not palindrome. Return Value :'+ 0);
      }
    }
    
    
}//my_fun_check_palindrome

console.log(my_fun_check_palindrome(1122));
console.log(my_fun_check_palindrome(11221));

您的函数需要知道它是否不应再调用自身,例如当它进行第二次和第三次检查时:

function sameOrPalindrome(num,stop) {      // <-- added "stop"
  var c = 0;
  var al = 0;
  var normalArray = num.toString().split("");
  var revArray = num.toString().split("").reverse();
  for (var i = 0; i < normalArray.length; i++) {
    if (normalArray[i] != revArray[i]) {
      c++;
    }
  }
  if (c == 0) {
    return 2;
  } else if(!stop) {                       // <-- check of "stop"
    num++;
    al = sameOrPalindrome(num,true);       // <-- passing true here
    if (al == 2) {
      return 1;
    } else {
      num++;
      al = sameOrPalindrome(num,true);     // <-- and also here
      if (al == 2) {
        return 1;
      }
    }
  }
  return 0;
}

for(let i=8225;i<8230;i++)
  console.log(i,sameOrPalindrome(i));

We should always strive to make function more effiecient... you dont need to run full loop. plus actual checking of palindrome can me modularized


<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>    function isSameOrPalindrome(num) {
      var normalArray = num.toString().split("");
      var revArray = num.toString().split("").reverse(),
      i;
      for (i = 0; i < normalArray.length / 2; i++) {
        if (normalArray[i] !== revArray[i]) {
         break;
        }
      }
      if (i >= normalArray.length/2) {
        return "Palindrome";
      } else {
        return "Not Palindrome";
      }
    }
function doCheck(num) {
 var isPalindrome = isSameOrPalindrome(num);
    console.log(isPalindrome);
    if(isPalindrome === "Palindrome") {
       return 2;
      } else {
       num++;
        isPalindrome = isSameOrPalindrome(num);
        if(isPalindrome === "Palindrome") {
       return 1;
      } else {
       return 0
      }
      }
}
    console.log("100",doCheck(100));