int fact(int n)
{
if (n >= 1)
return n * fact(n-1);
else
return 1;
}
Каждый раз, когда вызывается функция fact()
, она запускает либо оператор return n * fact(n-1);
, либо оператор return 1;
, но не оба.
Вы звоните fact(4)
в main()
. Вот как это работает:
main:
compute fact(4)
fact(4):
| 4 >= 1? Yes!
| compute 4 * fact(3)
| fact(3):
| | 3 >= 1? Yes!
| | compute 3 * fact(2)
| | fact(2):
| | | 2 >= 1? Yes!
| | | compute 2 * fact(1)
| | | fact(1):
| | | | 1 >= 1? Yes!
| | | | compute 1 * fact(0)
| | | | fact(0):
| | | | | 0 >= 1? NO!
| | | | | return 1;
| | | | +--> 1
| | | | fact(0) is 1, return 1 * 1 (--> 1)
| | | +--> 1
| | | fact(1) is 1, return 2 * 1 (--> 2)
| | +--> 2
| | fact(2) is 2, return 3 * 2 (--> 6)
| +--> 6
| fact(5) is 6, return 4 * 6 (--> 24)
+--> 24
fact(4) is 24, assign it to `ans`, print it etc
// end of main
Когда функция использует оператор return
(или после выполнения своего последнего оператора, если return
не достигнут, управление передается обратно в выражение, которое его вызвало.