【问题标题】:Recursion Tutorial递归教程
【发布时间】:2015-05-14 21:47:42
【问题描述】:

我正在从一本书中学习 Java,并且遇到了关于使用阶乘示例进行递归的章节。

//A simple example of recursion

package tutorials;

class Factorial {
// this is a recursive method
int fact (int n) {
    int result;

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

class Recursion {
    public static void main(String args[]) {
        Factorial f = new Factorial();

        System.out.println("Factorial of 3 is " + f.fact(3));
        System.out.println("Factorial of 4 is " + f.fact(4));
        System.out.println("Factorial of 5 is " + f.fact(5));
    }
}

这段代码给出的结果是“3 的阶乘是 6”和“4 的阶乘是 24”

我不明白的是 Factorial 类中发生了什么以及为什么不立即计算 *n。这本书没有很好地解释这一点,所以我想我会向任何有经验的程序员寻求帮助。

【问题讨论】:

  • 因为在一般的计算机科学和编程中,您希望尽可能多地节省计算量。执行递归 * N 会对系统造成负担。放下它,等待递归到达“1”是一种非常可取的方法。
  • 这个问题programmers.stackexchange.com/questions/25052/… 可能是一个很好的起点。
  • 远离递归,只有在必要时才使用它
  • 作为你自己:什么是 5 的阶乘?答案很简单:“它是 4 的阶乘的 5 倍”。 4的阶乘是多少?它是 3 的阶乘的 4 倍。(等等)
  • @RiteshK,所以没有人应该费心去学习或尝试理解它吗?

标签: java recursion factorial


【解决方案1】:

如果您调用fact(5),它的工作方式如下:

fact(5)
    5*fact(4)
        4*fact(3)
            3*fact(2)
                2*fact(1)
                    2*1=2 //(since if n==1, 1 is returned directly
                result=2
            result=3*2
        result=4*3*2
    result=5*4*3*2
result=120

递归仅仅意味着你在自身内部调用一个方法,通常是在操纵参数以适应你的最终结果之后(在这种情况下为n - 1)。您还要确保定义了一个终止条件(在这种情况下为n==1)。在内部,变量被推送到堆栈中以便在每次调用时记住,但这可能是另一天的讨论

【讨论】:

  • OK kaykay,我明白了,我尝试使用断点重新运行程序并单步执行它以查看变量发生了什么,仍然觉得它很烦人,但你的解释帮助我稍微清除了浑水。谢谢,
【解决方案2】:

数 n 的阶乘定义为: n * (n - 1) * (n - 2) * ... * 1 ,表示将 n 乘以小于 n 的所有正整数。 在您的示例中,这只是相反,因此您首先计算 n - 1 的阶乘,然后将其乘以 n。继续此递归,您将计算 n - 2、n - 3 的阶乘,以此类推,直到您必须计算 1 的阶乘。在这种情况下,您只需返回 1 本身并返回计算 2 的阶乘的递归链, 3, ... n - 1, n.

【讨论】:

  • 说真的,这个答案有什么不好的吗?
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多