Нет ответа от рекурсивной функции - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу создать функцию, которая сможет определить, является ли число тем же или палиндромом. если заданное число является палиндромом или одинаковым, тогда возвращает 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))

Ответы [ 6 ]

1 голос
/ 19 апреля 2020

вот мое решение этой проблемы:

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))
0 голосов
/ 19 апреля 2020
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 class="snippet-code-js lang-js prettyprint-override"><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));
0 голосов
/ 19 апреля 2020

Ваша функция должна знать, не должна ли она больше вызывать себя, например, когда она выполняет вторую и третью проверки:

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));
0 голосов
/ 19 апреля 2020

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));
0 голосов
/ 19 апреля 2020

Вопрос: Я предположил, что если тест палиндрома верен в первый раз, верните 2. если нет, попробуйте увеличить его на единицу и снова протестировать палиндром. если true, верните 1 else, попробуйте увеличить в последний раз и проверьте палиндром, если true, верните 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));
0 голосов
/ 19 апреля 2020

Возможно, не используя recurse - я думаю, что ваша функция зацикливается

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...