>>596
>int f(int n) {
>return (n == 0) ? 1 : n * f(n - 1);
>}
>
>ですら末尾再帰ではないことになるのでしょうか?

末尾再帰では有りません。
「ループに変換可能か」と言うより
「ジャンプ最適化可能か」です。

なお、c言語では末尾再帰最適化を行わない処理系も多いので、
処理系依存度を下げたいなら、末尾再帰に拘る必要は有りません。

>末尾再帰であるために
>
>int f(int n, int i, int p) {
>return (n == i) ? p : f(n, i + 1, p * (i + 1));
>}
>http://codepad.org/OSvQa0ni
>と書かねばならないのでしょうか?

Yes。
ただしgccなどの一部の処理系では上記部分を関数内関数で書けるので、
呼び出し側からはint f(int n)で済ませることが出来ます。