階乗を求める関数を考える。
まず、階乗とはどういうものか。

N! = N × (N-1) × (N-2) × …… × 2 × 1

と考える? いや、こう考える事もできる。

N! = N × (N-1)!

しかし、これは N が 0 の場合には成り立たない。(註: 0! は 1 であると定義されている)
(-1)! なんて定義されてないからだ。
じゃあ、こうしてしまおう。

N! = N × (N-1)!
ただし、N が 0 の時は N! = 1

OK。これが階乗だ。

次に、階乗の部分を関数で書いてみよう。
関数名は factorial とでもしよう。

factorial(N) = N × factorial(N-1)
ただし、N が 0 の時は factorial(N) = 1

で、これを C 風に書き直してみよう。

int factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); }

これで完成だ。
無理に処理の流れを考えようとするからハマる。
factorial という別の完成された関数があると考えて、
それを利用しているのと同じように考えればいい。基本的にはね。