【问题标题】:No response from recursive function递归函数没有响应
【发布时间】:2020-04-19 09:12:45
【问题描述】:

我想创建一个能够确定数字是相同还是回文的函数。如果给定数字是回文或相同则返回 2,否则如果它不是回文或相同则我需要通过将给定数字加 1 来检查它两次。之后如果它是回文或相同则返回 1。如果没有回文或相同数字找到然后返回 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))

【问题讨论】:

  • 什么是相同号码?请添加一些用例和想要的结果。
  • 它可能永远循环
  • 相同的数字意味着如果我给 1111 函数应该返回 2
  • 所以同样的意思是一个数字重复了很多次——所以111444466666是“相同的”但不是1221
  • 1221 是一个回文数,如果我输入这个数,函数应该返回 2

标签: javascript arrays palindrome


【解决方案1】:

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

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

【讨论】:

  • 你修复了什么?
  • 你能告诉我我的代码有什么问题吗?请回复。
  • @riyad303030 你做了一个不适合这个问题的递归函数。
【解决方案2】:

也许不使用递归 - 我认为你的函数循环

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));

【讨论】:

    【解决方案3】:

    问题:我假设如果回文测试第一次为真,则返回 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));

    【讨论】:

    【解决方案4】:

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

    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));

    【讨论】:

      【解决方案5】:

      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));

      【讨论】:

      • my_fun_check_palindrome(124546) return 2 它的 return 2 但在这种情况下它应该返回 0
      • 我编辑了代码。现在我得到了与要求相同的结果。
      【解决方案6】:
      We should always strive to make function more effiecient... you dont need to run full loop. plus actual checking of palindrome can me modularized
      
      
      
          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));

      【讨论】:

        猜你喜欢
        • 2017-09-14
        • 1970-01-01
        • 2020-12-08
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        相关资源
        最近更新 更多