cametan_42さんがコメントしてくれた書き込みはこちら。F#と似ているOcamlのコードですが、ものすごく参考になります。F#でも動いたのですが、若干の違いは有るようです。
末尾再帰は、説明を読んでも、ピンと来ないです。(涙&&哀)
ランキングに参加中。クリックして応援お願いします!
コメント利用規約に同意する
フォロー中フォローするフォローする
うん、僕も最初はピンと来ませんでした。
だから大丈夫、です。
繰り返しますが、関数の再帰呼び出しの際、関数の再帰呼び出し「しか」してないものを末尾再帰、と言います。
例えばC言語で、1+2+3+ ・・・ + nを計算せよ、と言った場合。
/* これは末尾再帰じゃない */
int sum(int n) {
if (n == 0) {
return 0;
} else {
return n + sum(n - 1); /* 再帰呼出しに何か足してる */
}
}
上の関数のように「再帰した関数」に足したり、引いたり、または別の関数を再帰関数の外側で使ったりしたら、これは末尾再帰じゃないです。
/* 末尾再帰の例 */
int sum(int n, int acc) {
if (n == 0) {
return acc;
} else {
return sum(n - 1, n + acc); /* 再帰呼出ししかしていない */
}
}
これは再帰としてsumしか呼んでません。この形式の再帰を末尾再帰、と言うんです。
結果、末尾再帰の特徴は
「関数の引数内で計算を行う」
パターンが多いです。
今の感じではcametan_42さんの説明が一番ピンとくるように思います。