末尾再帰について教えてください。
宿題スレにて、http://toro.2ch.net/test/read.cgi/tech/1335517816/497 が末尾再帰でないとの指摘があり、いろいろと考えていました。
思うに、http://toro.2ch.net/test/read.cgi/tech/1335517816/505 を理由に末尾再帰でない、ということになれば、よくある階乗の再帰関数

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

ですら末尾再帰ではないことになるのでしょうか?
末尾再帰であるために

int f(int n, int i, int p) {
return (n == i) ? p : f(n, i + 1, p * (i + 1));
}
http://codepad.org/OSvQa0ni
と書かねばならないのでしょうか?
主観的な表現になりますが、なんだかつまらなくなってしまいました。

コメントをいただけるとうれしいです。よろしくお願いいたします。