使用递归的数字的因子

时间:2013-06-20 21:04:32

标签: java recursion

我有以下递归函数来计算数字的阶乘。该程序工作正常,除非我删除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)

请专家告诉我为什么会这样?

7 个答案:

答案 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在其堆栈中有一些空间,这将继续运行。