LoginSignup
2
2

More than 3 years have passed since last update.

なぜJSでRecursion(再帰)を書くときはTail Call(末尾)にすべきか?

Last updated at Posted at 2020-12-10

簡単に言うと

こう書くのではなく↓

function countDown(num) {
  if(num > 0) {
    console.log(num)
    countDown(num - 1) // <-- 再帰🙋‍♂️
  } else {
    console.log("0になったよ!")
  }
}

こう書いてね↓👍

function countDown(num) {
  //「Base Case」または「Exit」と呼ばれているよ↓
  if(num <= 0) { 
    console.log("0になったよ!")
    return
  } 

  console.log(num)
  countDown(num - 1) // <-- 再帰🙋‍♀️
}

運が良ければ、作動スピードが上がるよ!

何でそうするの?

ブラウザには、再帰できる数に制限があるから、一定の量を超えてしまうとあの有名な「スタック・オーバーフロー」になっちゃう。(処理できずにエラーを飛ばすの)

でも、再帰の部分のを関数の最後に書いておくと、いくつかのブラウザは勝手に「最適化」してくれて、ほぼ無制限に再帰できる。

そして、スピードもぐんと上がる。

見た目も分かりやすいし、いいこと尽くし。

具体的な原理は?

結構ディープな内容なので、エリート君はこちらを参照(英語):
https://exploringjs.com/es6/ch_tail-calls.html

要するに(日本語で):

通常の再帰演算ではなく、goto(次)みたいないな感じにできるから、無制限に呼び出せてスピードも早くなる。

オタクっぽいあなたにも

ES2015(ES6)の仕様書にTCE(Tail Call Elimination)が選定されて、その後色々あってブラウザに採用されたり採用されなかったり。結局今その機能が動いているのはSafariだけなんだけど。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2