Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归函数导致堆栈溢出错误_Java_Recursion - Fatal编程技术网

Java 递归函数导致堆栈溢出错误

Java 递归函数导致堆栈溢出错误,java,recursion,Java,Recursion,我不明白为什么这个函数会导致堆栈溢出错误。如果有人能给我解释一下,我会非常感激的 public static int count7(int n){ if(n == 0){ return 0; } if (n==7){ return 1; } if (n%10 == 7){ return 1 + count7(n/10); } else{ return count7(n/10);

我不明白为什么这个函数会导致堆栈溢出错误。如果有人能给我解释一下,我会非常感激的

public static int count7(int n){
    if(n == 0){
        return 0;
    }
    if (n==7){
        return 1;
    }
    if (n%10 == 7){
        return 1 + count7(n/10);
    }
    else{
        return count7(n/10);
    }
}
它可以与“77777”之类的东西一起使用,但是“999999”以及“123”和“47571”都会给出错误

所以我补充说:

if(n == 0){
        return 0;
    }

现在它似乎起作用了

您没有停止条件。您应该在此处添加:

if (n == 0) return 0;

在某些情况下,您会有无休止的重复调用(如果n永远不等于7)

例如:

n = 123     //initial call
n = 12    //1st recursive call
n = 1    //2nd recursive call
n = 0    //3rd recursive call
该值从不为n=7,因此您从不返回任何内容,并且您一直调用count7(n/10)

您应该更改代码以捕获所有基本情况:

public static int count7(int n){
if (n==7){
    return 1;
} else if (n < 7) {
    return 0; // I assumed you wanted to return 0, you can change this to return 1...
}
if (n%10 == 7){
    return 1 + count7(n/10);
}
else{
    return count7(n/10);
}
}
publicstaticintcount7(intn){
如果(n==7){
返回1;
}else if(n<7){
return 0;//我假设您想要返回0,您可以将其更改为返回1。。。
}
如果(n%10==7){
返回1+count7(n/10);
}
否则{
返回计数7(n/10);
}
}

好吧,当最后一个数字没有满足这两个条件时,它只调用else块

return count7(n/10)
由于将一个单位数整数除以10,因此使用0时,它将截断为0,因此在溢出发生之前,它与调用此行的条件不匹配。您可以添加一个基本语句

if(n==0) return 0;
另外,为了帮助调试过程,我建议您使用print语句跟踪调试过程,以查看变量的情况。例如,添加

System.out.println("n = " + n);

在每个返回语句之前。

取数字123,看看执行流程是什么。哦,这也是一个使用递归的非常糟糕的例子(我希望这只是一个练习)。@ZouZou为什么它不适合使用递归?是的,这只是学习递归如何工作和使用的练习。因为这是使用简单循环可以实现的方法。只需分析原始代码中的123示例。第一次递归返回0+count7(12)第二次递归返回0+count7(1)第三次递归和无穷大返回0+count(0)谢谢!只是想补充一下,如果我只做if(n我会做if)(n第一个if语句返回if(n==7),第二个if语句返回if(n<7)。添加if(n>7)是多余的,因为在这一点上它将始终为真(除非n>7为真,否则逻辑上不可能到达该代码)。