Factorial using Recursion in Java

前端 未结 18 1316
春和景丽
春和景丽 2020-11-27 13:43

I am learning Java using the book Java: The Complete Reference. Currently I am working on the topic Recursion.

Please Note: There are similar questi

相关标签:
18条回答
  • 2020-11-27 14:08

    Your confusion, I believe, comes from the fact that you think there is only one result variable, whereas actually there is a result variable for each function call. Therefor, old results aren't replaced, but returned.

    TO ELABORATE:

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

    Assume a call to fact(2):

    int result;
    if ( n == 1 ) // false, go to next statement
    result = fact(1) * 2; // calls fact(1):
    |    
    |fact(1)
    |    int result;  //different variable
    |    if ( n == 1 )  // true
    |        return 1;  // this will return 1, i.e. call to fact(1) is 1
    result = 1 * 2; // because fact(1) = 1
    return 2;
    

    Hope it's clearer now.

    0 讨论(0)
  • 2020-11-27 14:09

    result is a local variable of the fact method. So each time the fact method is called, the result is stored in a different variable than the previous fact invocation.

    So when fact is invoked with 3 as argument, you can imagine that its result is

     result3 = fact(2) * 3
     result3 = result2 * 3
     result3 = 1 * 2 * 3
    
    0 讨论(0)
  • 2020-11-27 14:09

    What happens is that the recursive call itself results in further recursive behaviour. If you were to write it out you get:

     fact(4)
     fact(3) * 4;
     (fact(2) * 3) * 4;
     ((fact(1) * 2) * 3) * 4;
     ((1 * 2) * 3) * 4;
    
    0 讨论(0)
  • 2020-11-27 14:10
    public class Factorial {
    public static void main(String[] args) {
       int n = 7;
       int result = 1;
       for (int i = 1; i <= n; i++) {
           result = result * i;
       }
       System.out.println("The factorial of 7 is " + result);
    }
    }
    
    0 讨论(0)
  • 2020-11-27 14:11

    A recursive solution using ternary operators.

    public static int fac(int n) {
        return (n < 1) ? 1 : n*fac(n-1);
    }
    
    0 讨论(0)
  • 2020-11-27 14:12

    The correct one is :

    int factorial(int n)
    {
        if(n==0||n==1)
            return 1;
        else 
            return n*factorial(n-1);
    }
    

    This would return 1 for factorial 0. Do it believe me . I have learned this the hard way. Just for not keeping the condition for 0 could not clear an interview.

    0 讨论(0)
提交回复
热议问题