我有一个程序可以递归调用函数。以下程序为我提供了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");
}
}
答案 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");
}
}