accだけに注目してみましょう。nが1つずつ減っていくたびに、accにはその時のnが掛けられます。最初はn、その次はn-1、その次はn-2という風に。なんだか階乗の計算を逆からやっているような感じですが、実際その通りです。再帰とループプログラムを勉強したことがある人は、再帰とループはいつでも相互に変換可能であると聞いたことがあると思います。再帰呼び出しをループに変換してしまえばもちろんコールスタックは消費しないので、いつまでもループすることができます。この点で末尾再帰とループ変換は同じ方向を向いていると言えます。末尾再帰が隣の人に作業を頼むなら、ループ変換は一人で黙々と計算し続けるイメージです。ところがいくつかのプログラム言語にはループが言語仕様として定められていない、あるいは煩雑であるようなものがあります。関数型言語がいい例です。そのため末尾再帰がより利用され、そのようなコンパイラも末尾再帰の最適化をサポートしています。ここまでの例で使っておいてなんですが、Javaのコンパイラは残念ながら末尾再帰の最適化をサポートしていません。まとめ今回は末尾再帰を学習しました。末尾再帰とはプログラミングにおける再帰呼び出しの一種で、コンパイラの最適化によってはコールスタックを消費しないためネストが深くなりがちの再帰処理に向いています。末尾再帰になる条件は「再帰呼び出しを行う行がreturnと関数呼び出しだけで構成されていること」です。SDKが発表されたぞ。S3にブログを移行しました。CloudFrontを使ってS3上のウェブサイトをHTTPSに対応したSearch。