因此,我正在做這個練習,找到只使用String類的下一個迴文。代碼爲123456789提供java.lang.StackOverflowError,但不爲9999999999999999999
我有點解決它,但有一個問題。
當我輸入像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));}
}
}
一般觀察:您的遞歸可以被一個循環替換,避免堆棧溢出的所有風險。 – keshlam
另外,爲什麼你需要'str.substring(0,str.length() - 1)'?它與'str'完全相同。 –
同意上述意見。你可以發佈堆棧跟蹤嗎?我將你的代碼複製到eclipse中,它運行時沒有任何溢出錯誤。 – Mick