因此,我正在做这个练习,仅使用 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));}
}
}
最佳答案
因为仅当输入的值不是回文数时才进行递归,并且需要超过 10,000 次递归才能将 123456789 增加到回文数。
你的代码有点奇怪,你采用一个字符串,你假设它是一个数字,并使用字符串操作递增它。转换为 long(如果 Long 不够大则转换为 BigInteger)会简单得多。
此外,您似乎增加了两次,一次在 palindroom
方法的开头,另一次在 else
block 中。
更新 从您的评论来看,我认为您可能不清楚什么是堆栈溢出错误。所以java调用栈就是方法的栈(即LIFO)。在你的情况下,你的调用堆栈将是main,palindroom,palindroom,palindroom,palindroom,palindroom等...请注意java只允许调用堆栈的最大大小,如果超过这个大小,你会得到一个堆栈溢出异常。 Java stack overflow error - how to increase the stack size in Eclipse? 有一些关于默认值和配置的详细信息。
关于java - 代码为 123456789 提供了 java.lang.StackOverflowError,但为 9999999999999999999 提供了 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102260/