我有以下递归函数来计算数字的阶乘。该程序工作正常,除非我删除if条件。有人可以解释原因吗?
这是正常运行的代码 -
public static long factUsingRecursion(int number) {
if (number == 1) {
return 1;
} else {
return number * factUsingRecursion(number - 1);
}
}
没有if条件(抛出错误的代码),
public static long factUsingRecursion(int number) {
return number * factUsingRecursion(number - 1);
}
我收到堆栈溢出错误。
主题“main”
java.lang.StackOverflowError
中的异常 在birst.FactorialUsingRecursion.factUsingRecursion(FactorialUsingRecursion.java:10)
请专家告诉我为什么会这样?
答案 0 :(得分:7)
在递归中,必须始终存在一个停止递归的基本情况。没有if
,你没有基本情况,也没有任何阻止它。最终,堆栈上的方法调用太多,并且会产生StackOverflowError
个结果。
答案 1 :(得分:2)
此行导致number
变量减少1
return number * factUsingRecursion(number - 1);
并且它将处理number
的所有值,除非它是1
所以这行代码是一个中断条件
if (number == 1) {
return 1;
}
它可以防止你避免stackoverflow异常
答案 2 :(得分:2)
递归需要一个基本案例。没有它,它将继续一遍又一遍地调用该函数,并且永远不会停止。 if语句是基本情况,它终止递归。这就是为什么如果你删除它,你得到一个StackOverflowError
。
答案 3 :(得分:2)
想象一下当你打电话时会发生什么:
factUsingRecursion(3);
使用if:
3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1
没有if:
3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1*factUsingRecursion(0)
3*2*1*0*factUsingRecursion(-1)
3*2*1*0*-1*factUsingRecursion(-2)
3*2*1*0*-1*-2*factUsingRecursion(-3)
...
And so on... It will not stop until you encounter the StackOverflow error
答案 4 :(得分:1)
它失去了一个使递归函数递归的东西,因为它没有退出条件。
所有递归解决方案必须满足三个规则或属性: 递归解决方案必须包含基本案例。 递归解决方案必须包含递归案例。 递归解决方案必须在基本情况下取得进展。
来自:使用Python的数据结构和算法
答案 5 :(得分:1)
删除if条件后程序将不再有效,因为您只剩下return number * factUsingRecursion(number - 1);
,factUsingRecursion(number - 1)
此处将返回相同的return number * factUsingRecursion(number - 1);
。你的功能不断地自我调用,永远不能评估任何东西。通过设置条件,您的函数能够在递归链中的某个点评估到一个确定的值,并且第一个调用可以进行评估。
答案 6 :(得分:0)
对于每个整数i,您使用i -1调用该函数。 Integersa是无限的,所以你永远不会停止调用该函数。例如:-1000将调用-1001,只要JVM在其堆栈中有一些空间,这将继续运行。