>>475
俺が>>472 で「ループ」と言ったのは正確には
「再帰を使わないループ」という意味。不正確な言い方してゴメン。
で、そういうことだから>>475 はダメ。

それから、>>479 は良く見たら>>477が同じこと言ってたね。

で分かりやすく書いてみる。

よく「末尾再帰はループになる」って言い方するけど、
コンパイラ:「末尾再帰ハケーン!!ループにしますた。」
じゃなくて、実際には。
コンパイラ:「末尾呼び出しハケーン!!ジャンプ命令にしますた。」
って事なの。
だから *結果的に* 末尾再帰はループになるし、
相互再帰とかも素直に処理される。
(もちろん単なるジャンプじゃなくて引数の受け渡しとかの問題が有るけど
それは置いといて)
だから、「for-each-pair は末尾再帰関数か?」という問いには
NO と答えるしか無いけど、
「for-each-pair の2回の再帰呼び出しが普通に呼び出されるか?」
という問いもやはり NO になる。
外側の方の再帰呼び出しはジャンプ命令になる。
すると、結局for-each-pairは、
「ループがあってその中で自分自身を1回だけ呼び出している。」
そんな関数にコンパイルされる。
だから>>477の言ったようになる。