上の奴は「戻り値を使用した計算」という、
関数を処理した後に行わないといけない処理を含んでいる。
自己末尾再帰ってのは、
「最も最後に行われる処理が自己再帰」であるから、
上の奴は自己末尾再帰ではない。

自己末尾再帰はループ処理に最適化可能だから、
パフォーマンスを考えると自己末尾再帰が良い。
下のように戻り値用の引数を加えるというのはよくある手。