使用递归来确定数字是否是回文

时间:2016-06-29 13:44:12

标签: java recursion numbers palindrome

这里的目标是使用递归来检查数字是否是回文。今天是我递归的第一天,因为你可以看到代码似乎不太令人信服。

我尝试使用print语句来查看出错的地方。我第一次运行程序时输入'101'。'pal_Q'和'temp'具有相同的值(101),但输出为'数字不是回文'。

我不确定出了什么问题所以我再次输入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);
}

4 个答案:

答案 0 :(得分:2)

如果你想了解递归,那么你也可以通过将数字转换为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);
}

答案 1 :(得分:0)

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

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

}

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

答案 2 :(得分:0)

@ pbajpai21提供了另一种解决方案,但我回答了您的原始问题。

pal_Q的最终值为7370;你只需要将它除以10,然后你的代码是正确的。

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

答案 3 :(得分:0)

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

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

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