使用递归判断一个数是否为回文

Using recursion to determine if a number is a palindrome

这里的objective是用递归判断一个数是否回文。今天是我使用递归的第一天,所以你可以看到代码似乎不太令人信服。

我尝试使用 print 语句查看出了什么问题。我第一次 运行 我输入 '101'.'pal_Q' 和 'temp' 的程序具有相同的值 (101) 但是输出是 'The number is not a palindrome'.

我不确定哪里出了问题,所以我 运行 再次输入 22,但仍然无效。我的 if 语句有问题吗?错误是什么?

private static int pal_Q = 0;
private static int originalNumber;
private static int i = 0;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the number");
    checkPal(sc.nextInt());

    if (pal_Q == temp) {
        System.out.println("The number is a palindrome");
    }
    else if (pal_Q != originalNumber) {
        System.out.println("The number is not a palindrome");
    }
}

public static int checkPal(int n) {
    pal_Q *= 10;
    if (i == 0) {
        originalNumber = n;
        i++;
    }
    if (n == 0) {
        return 1;
    }
    pal_Q += n % 10;
    System.out.print("Pal_Q=" + pal_Q + ", origNum=" + originalNumber);
    System.out.println(", n=" + n + " " + (n % 10));
    return checkPal(n / 10);
}

如果你想学习递归,那么你也可以通过将数字转换为String来解决上面的问题,因为如果我们只检查数字是否是回文,那么它会通过首先将数字转换为 String (或字符数组)来很容易地解决它。查看下面的代码,检查 isPalindrome() 方法,并调试它以使递归工作。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the number");
    String str = String.valueOf(sc.nextInt());
    boolean isPalin = isPalindrome(str, 0, str.length() - 1);
    if (isPalin) {
        System.out.println("The number is a palindrome");
    }
    else {
        System.out.println("The number is not a palindrome");
    }
}

private static boolean isPalindrome(String num, int i, int j) {
    if (i >= j) {
        return true;
    }
    return num.charAt(i) == num.charAt(j) && isPalindrome(num, i + 1, j - 1);
}

这是一个数值运算的解决方案,而不是转换为 String。它有一个简单的 public 前端,并使用私有后端进行递归以隐藏用户不需要看到或知道的状态检查信息。

import java.util.Scanner;

public class PalindromeChecker {

   public static boolean isPalindrome(int number) {
      return backend(number, 0, number);
   }

   private static boolean backend(int original, int reversed, int reduced) {
      if (reversed == original) return true ;
      if (reduced < 1)          return false; 
      return backend(original, reversed * 10 + reduced % 10, reduced / 10);
   }

   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the number");
      int number = sc.nextInt();
      if (isPalindrome(number)) {
         System.out.println("The number is a palindrome");
      } else {
         System.out.println("The number is not a palindrome");
      }
      sc.close();
   }

}

在其他语言中,您可以通过使用参数的默认值来避免后端。

@pbajpai21 提供了替代解决方案,但我正在回答你原来的问题。

pal_Q的最终值为7370;你只需要除以10,你的代码就正确了。

checkPal(sc.nextInt());
if (pal_Q / 10 == temp) {
    // Is palindrome
}
else {
    // Is not a palindrome
}

使用全局作用域或静态变量来执行递归通常表明没有完全掌握递归应该如何工作。我建议用树和链表解决一些编程问题,这些数据结构适合练习和理解递归。

您问题的一种可能解决方案,无需将数字转换为字符串:

public class NumericPalindrome {

   public static void main(String args[]) {
       System.out.println(isNumericPalindrome(22)); // true
       System.out.println(isNumericPalindrome(131)); // true
       System.out.println(isNumericPalindrome(1)); // true
       System.out.println(isNumericPalindrome(9987)); // false
       System.out.println(isNumericPalindrome(1331)); // true
       System.out.println(isNumericPalindrome(-1221)); // true
       System.out.println(isNumericPalindrome(112112)); // false
   }

   public static boolean isNumericPalindrome(int n) {
       // Define how negative numbers should be handled
       if (n < 0)
          n = Math.abs(n); // or n *= -1;

       if (n < 10)
          return true;

       return isNumericPalindrome(n, n, 0);
   }

   private static boolean isNumericPalindrome(int original, int sliced, int pow) {
       if (sliced < 10)
          return sliced == original % 10;

       return isNumericPalindrome(original, sliced / 10, pow + 1) &&
              sliced % 10 == (original / (int) Math.pow(10, pow)) % 10;
   }
}