因此,我仅通过使用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?包含有关默认设置和配置的一些详细信息。