java - 代码为 123456789 提供了 java.lang.StackOverflowError,但为 9999999999999999999 提供了 java.lang.StackOverflowError

标签 java recursion stack-overflow

因此,我正在做这个练习,仅使用 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/

相关文章:

java - 获取目录和子目录中所有txt文件的列表并将其添加到List中

java - Glassfish 3.1 上的 @WebServlet 映射错误

java - Stackoverflow 与 Quicksort Java 实现

java - Servlet 容器中的请求参数顺序

php - 如何使用点表示法在 PHP 中展开数组

algorithm - 修改后的二叉树的有序遍历

java - StackOverFlow 处理大小为 100000 及以上的输入时出错

你能解释一下在寻找缓冲区溢出可能性时找到缓冲区偏移量的方法吗

java - 在构造函数方法上调用方法

c++ - 在 main 之后立即导致堆栈溢出的代码