riyad303030
riyad303030

Reputation: 39

No response from recursive function

I want to create a function that is able to determine if a number is same or palindrome. if a given number is palindrome or same then return 2 otherwise if it is not palindrome or same then i need check it twice by increment the given number by 1. after that if it palindrome or same then return 1. if no palindrome or same number found then return 0. i write the function which is giving me the exact result when i give the number as 11211 but the function don't show any response if i enter 1122 or other random value. please help me to find where the error of my function.

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

Upvotes: 0

Views: 95

Answers (6)

M Shahzaib Shoaib
M Shahzaib Shoaib

Reputation: 324

here is my solution to this problem:

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

Upvotes: 1

ChartistDev
ChartistDev

Reputation: 1

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

Upvotes: 0

shivccs
shivccs

Reputation: 41

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

Upvotes: 0

tevemadar
tevemadar

Reputation: 13225

Your function needs to know if it should not call itself any more, e.g. when it's doing the second and third checks:

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

Upvotes: 0

M A Salman
M A Salman

Reputation: 3820

Question: I assumed if palindrome test is true at first time then return 2. if not try incrementing by one and test the palindrome again . if true return 1 else try incrementing for last time and check the palindrome if true return 1 else 0.

Store string into array first and do arr.reverse().join("") to compare

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

Upvotes: 0

mplungjan
mplungjan

Reputation: 178350

Perhaps not using recurse - I think your function loops

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

Upvotes: 0

Related Questions