I created two recursive methods to calculate factorial as follows:
private int fact1(int n) {
if (n == 0 || n == 1)
return 1;
return n * fact1(--n);
}
private int fact2(int n) {
if (n == 0 || n == 1)
return 1;
return fact2(--n) * n;
}
When I call fact1(4)
it returns 24
. When I call fact2(4)
it returns 6
(EDIT: is not returning 18
but 6
). I know the second method is making 3 * 2 * 1, but I don't understand why not 4 * 3 * 2 * 1.
The same happens if I change the return to
//fact3(4) returns 60.
return (n + 1) * fact3(--n); // wrong
//fact4(4) returns 24
return fact4(--n) * (n + 1); // works
Why is the method exhibiting this behavior??
The question is about the different behaviour. I know n * fact(n-1)
is the better way to solve it.
Can someone help me to understand the evaluation of this expression? Thanks!
It all comes down to the difference between these expressions:
return n * f(--n);
return f(--n) * n;
When n = 4
, these expressions are evaluated like this:
return 4 * f(3);
return f(3) * 3;
Because the moment --n
is evaluated, the value of n
is decreased by 1.
This is how the prefix --
operator works.
It might help to recursively evaluate the entire expressions by hand. The first one:
// first
return 4 * f(3);
return 4 * 3 * f(2);
return 4 * 3 * 2 * f(1);
return 4 * 3 * 2 * 1;
// second
return f(3) * 3;
return f(2) * 2 * 3;
return f(1) * 1 * 2 * 3;
return 1 * 1 * 2 * 3;
On a related note, guess how this will be evaluated:
return f(n--) * n;
It will be:
return f(4) * 3;
Because here the postfix --
operator is used: the -1 decrement will be applied after the evaluation of n
in f(...)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With