因此,我仅通过使用String类来进行查找下一个回文的练习。

我有点解决了,但是有一个问题。

当我输入123456789之类的字符串时,会收到java.lang.StackOverflowError。
当我输入较大的字符串(如9999999999999999999)时,不会收到错误消息。
我在这个网站上做了一些研究,我认为这与我使用的递归回文法有关。

有什么办法可以改善我的代码,以便处理更大的数字?以及为什么123456789会给出错误而9999999999999999999不会呢?后者更大。

import java.io.*;

public class mainclass {

public static void main(String[] args) throws IOException {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(isr);
    System.out.println(palindroom(in.readLine()));
    }

public static String increment(String str){
    String incre="";
    if(str.equals("9")){incre = "10";}
    else{
        switch(str.charAt(str.length()-1)){
        case '0': incre = str.substring(0, str.length()-1)+"1";break;
        case '1': incre = str.substring(0, str.length()-1)+"2";break;
        case '2': incre = str.substring(0, str.length()-1)+"3";break;
        case '3': incre = str.substring(0, str.length()-1)+"4";break;
        case '4': incre = str.substring(0, str.length()-1)+"5";break;
        case '5': incre = str.substring(0, str.length()-1)+"6";break;
        case '6': incre = str.substring(0, str.length()-1)+"7";break;
        case '7': incre = str.substring(0, str.length()-1)+"8";break;
        case '8': incre = str.substring(0, str.length()-1)+"9";break;
        case '9': incre = increment(str.substring(0, str.length()-1))+"0";break;
        };
        }
    return incre;
    }

public static String palindroom(String str){
    String palin=increment(str);
    boolean isPalindroom=true;
    for(int i=0;i<palin.length();i++){
        if(palin.charAt(i)==palin.charAt(palin.length()-i-1)){}
        else{isPalindroom=false;}
    }
    if(isPalindroom){return palin;}
    else{return palindroom(increment(str));}
}
}

最佳答案

因为仅当输入的值不是回文,您才进行递归,因此将123456789递增到回文中将需要10,000次以上的递归。

您的代码有点奇怪,您选择了一个假定为数字的字符串,并使用字符串操作对其进行了递增。转换为long(如果Long不够大,则转换为BigInteger)会更简单。

此外,您似乎增加了两次,一次是在palindroom方法的开始,另一次是在else块。

更新
根据您的评论,我认为您可能不清楚什么是堆栈溢出错误。因此,java调用堆栈是方法的堆栈(即LIFO)。在您的情况下,您的调用堆栈将是main,palindroom,palindroom,palindroom,palindroom,palindroom等。。请注意,java仅允许调用堆栈的最大大小,如果超过此大小,则会出现堆栈溢出异常。 Java stack overflow error - how to increase the stack size in Eclipse?包含有关默认设置和配置的一些详细信息。

07-24 21:07