Java循环StackoverflowError - 当再次重现相同的函数时,是否有可能继续前一个循环?

时间:2014-11-03 05:43:46

标签: java recursion

我有一个程序可以递归调用函数。以下程序为我提供了StackOverflowError

我预期的输出是

normal print, normal print, normal print, normal print, inside function splcase now, call action key word now, normal print, normal print, normal print, normal print, normal print

是否有可能控制递归函数以便获得所需的输出?

public class mytest1 {

    String path, keyword;

    public static void main(String args[]){
        exec_script("normal");
    }

    public static void exec_script(String exec_path){
        for (int i=0; i<10; i++) {
            if (i==4) {
                exec_path = "spl";
            }

            switch (exec_path){
            case "spl":
                spl_case();
                break;
            case "normal":
                System.out.println("normal print");
                break;
            case "call_action_path":
                System.out.println("call action key word now");
                break;
            }
        }
    }

    public static void spl_case(){
        System.out.println("inside function splcase now");
        exec_script("call_action_path");
    }
}

4 个答案:

答案 0 :(得分:1)

这个代码可以帮助你。

public class mytest1 {

    String path, keyword;

    public static void main(String args[]){
        mytest1. exec_script("normal");
    }

    public static void exec_script(String exec_path){
        for (int i=0; i<10; i++){
            if (i==4){
                // exec_path = "spl";
                tree("spl");
            }

            tree(exec_path);

            // switch (exec_path){
            // case "spl":
            //     spl_case();
            //     break;
            // case "normal":
            //     System.out.println("normal print");
            //     break;
            // case "call_action_path":
            //     System.out.println("call action key word now");
            //     break;
            // }
        }
    }

    public static void tree(String exec_path){
        switch (exec_path){
        case "spl":
            spl_case();
            break;
        case "normal":
            System.out.println("normal print");
            break;
        case "call_action_path":
            System.out.println("call action key word now");
            break;
        }
    }

    public static void spl_case(){
        System.out.println("inside function splcase now");
        //exec_script("call_action_path");
        tree("call_action_path");
    }
}

答案 1 :(得分:0)

您收到堆栈溢出错误,因为递归会多次执行该方法,直到堆栈溢出。

在从main调用方法后,该方法在第4次迭代中调用spl_case并执行第2次exec_script,然后在第4次迭代中执行调用spl_case并继续进程直到堆栈溢出。

以下程序可以满足您的需求:

public class mytest1 {

    String path, keyword; //you have unused variables

    public static void main(String args[]){
        exec_script("normal");
    }

    public static void exec_script(String exec_path){
        for (int i=0; i<10; i++) {
            if (i==4) {
                exec_path = "spl";
            }

            switch (exec_path){
            case "spl":
                spl_case();
                System.out.println("call action key word now");
                exec_path = "normal";
                break;
            case "normal":
                System.out.println("normal print");
                break;
            }
        }
    }

    public static void spl_case(){
        System.out.println("inside function splcase now");
    }
}

答案 2 :(得分:0)

你会得到stackoverflow错误,因为你的递归会多次执行该方法,直到堆栈溢出。

您需要在代码中进行以下两项修改才能正常工作

首先,你需要停止递归。因此,在switch语句中将“return”语句放在下面的case中,而不是“break”语句。

case "call_action_path":
            System.out.println("call action key word now");
            return;
}

第二次修改是,

当i == 4时修改“exec_path”变量值。因此,exec_path变量值变为“spl”。因此,由于exec_path具有“spl”值,因此保留连续迭代,将执行大小写“spl”。因此,在下列情况下将“exec_path”变量修改为“normal”,

case "spl":
    spl_case();
    exec_path = "normal";
    break;

因此,请进行以下修改并运行

答案 3 :(得分:-2)

从上面它继续打印迭代,所以使用下面的代码。

所以请使用以下代码

public class mytest1 {

    String path, keyword;

    public static void main(String args[]){

        exec_script("normal");
    }
    public static void exec_script(String exec_path){
        for (int i=0; i<10; i++){
        if (i==4){
            exec_path = "spl";
        }

        switch (exec_path){
        case "spl":
            spl_case();
            break;
        case "normal":
            System.out.println("normal print");
            break;
        case "call_action_path":
            System.out.println("call action key word now");
            break;

        }
        return;
    }
    }

    public static void spl_case(){
        System.out.println("inside function splcase now");
        exec_script("call_action_path");
    }

}