Java阶乘程序中的递归

时间:2014-11-08 13:57:13

标签: java recursion

我对递归的了解是,函数调用自身并且它具有停止的基本条件。我的教授写了一个程序,他称其中的递归正在发生,我说不,它不是。我很困惑。所以我要求你清除我的困惑。他编写的程序如下:

int fact(int n) {
    if (n == 0) {
        return 1;
    }

    for (int i = n; i >= 1; i--) {
        s1.push(i);
    }
    return Return_result();

}

int Return_result() {
    int f = 1;
    while (s1.top != -1) {
        f = f * s1.pop();
    }
    return f;
}

2 个答案:

答案 0 :(得分:4)

你是对的,所提出的代码中没有递归。这是一种迭代方法。

递归是,如果在f()方法(在Java命名法中)或函数(在一般情况下),您可以调用f()

递归方法将如下所示:

int fact(int n) {
    return (n <= 1) ? 1 : fact(n - 1) * n;
}

或者,使用tail-recursion(也称为&#34;尾调用&#34;):

int fact(int n) {
    return factTail(n, 1);
}

int factTail(int n, int accumulator) {
    return (n <= 1) ? accumulator : factTail(n - 1, n * accumulator);
}

目前,JVM没有执行尾递归优化,但是this can change

  

值得注意的是,这不是JVM中的错误。这是一个   可以实现的优化以帮助功能程序员   谁使用递归,这在那些更常见和正常   语言。我最近在Oracle与Brian Goetz谈过此事   优化,他说它是在要添加的事物列表中   JVM,但它不是一个高优先级的项目。现在,它是最好的   如果可以的话,通过深度避免来自己进行优化   在JVM上编写函数式语言时的递归函数。

答案 1 :(得分:1)

首先我要解释一些事实:

  1. 因子通过以下公式计算:n! = n * n-1 * n-2 * n-3 * .....* 3 * 2 * 1
  2. 堆栈适用于LIFO = last in first outFILO = first in last out
  3. 所以代码执行以下操作首先将所有数字从n放到堆栈中,然后弹出每个数字并将其与当前结果相乘以得到最后的阶乘

    并且通过对于阶乘(非递归)的迭代版本的方式,递归版本将如下所示

    int fact(int n)
    {
        int result;
    
       if(n==1)
         return 1;
    
       result = fact(n-1) * n;
       return result;
    }