需要Java递归中的解释

时间:2017-06-23 15:11:08

标签: java algorithm

这是我的代码,我需要解释这段代码是如何工作的result=fact(n-1)*n;。我的预期答案与输出不一样。我想在返回后栈应该执行恢复状态,第一个执行状态是 n=2(2-1)*2=2,然后是n=3,(3-1)*3=6,然后是n=4,(4-1)*4=12,然后是n=5,(5-1)*5=20。 我预期的最终答案是20.我怎么得到120?堆栈如何在这种情况下工作?提前致谢。

public class Factorial 
{

int fact(int n)
{
    int result;
    if(n==1) return 1;
    result=fact(n-1)*n;
    System.out.println("value of n="+n);
    System.out.println(result);
    return result;
}
}

class TestFact
{
public static void main(String[] args)
{

    Factorial ob=new Factorial();

    System.out.println("Final="+ob.fact(5));
}
}

给定程序的输出是

n = 2的值

2 值n = 3

6 值n = 4

24 值n = 5

120

最后= 120

2 个答案:

答案 0 :(得分:3)

你误解了计算阶乘的方法。

对于每个n >= 1

,该方法定义如下

enter image description here

<强>例:

  1. 脂肪(1)= 1(根据定义)
  2. 脂肪(2)= 2 *脂肪(1)(项目1的结果)= 2 * 1 = 2
  3. 脂肪(3)= 3 *脂肪(2)(项目2的结果)= 3 * 2 = 6
  4. 脂肪(4)= 4 *脂肪(3)(项目3的结果)= 4 * 6 = 24
  5. 脂肪(5)= 5 *脂肪(4)(项目4的结果)= 5 * 24 = 120
  6. 算法是正确的。你只是误解了如何计算阶乘。

    改进代码以便更好地输出

    public class Factorial{
      int fact(int n) {
        int result;
        if(n==1) return 1;
        result=fact(n-1)*n;
        System.out.println("Fat(" + n + ")=" + result);
        return result;
      }
    
      public static void main(String[] args){
        Factorial fat = new Factorial();
        System.out.println("Final=" + fat.fact(5));
      }
    }
    

    Try it online!

答案 1 :(得分:0)

你的假设是完全错误的。

fact()函数的结果是1, 2, 6, 24。因此,要获得最终结果,您需要乘以1 * 2 * 6 * 24 = 120。

请参阅recursion