再帰について教えていただいたこと

2014/05/15

1st.js、2nd.js を書いて再帰について書いてみて、 他のひとはどう書くのだろうと以下を参考に 再帰は再帰なんかじゃない!末尾再帰こそが真の再帰なんだ! RubyのコードをJavaScriptに自分なりに置き換えてみたのが、3rd.jsである。 で「2ndと3rdどっちがいいのかな」的にTLにお伺いしてみたところ、 @kaoriya さん(いつもありがとうございます!)にコメントいただけて勉強になりました(ので記す)。

まとめると以下のようなご指摘をいただけた。

  1. 2nd.js の方は当初行頭の var z = 0; がコピペミスでなかったこともあるが、(たとえコピペミスがなかったにせよ)「関数プログラミング的でない記述」である
  2. 3rd.js の仮引数のデフォ値設定 x(y,z=y) は構文違反である。
  3. そもそも z なんていらんのでは!もっと綺麗に書けるよ!

  1. については 確かに「閉じてない」ことは指摘されるに十分と思いました。

  2. については ECMAScriptの方は確認できてないのですが『JavaScript 第6版』の 8.3.1 [省略可能な引数]においては、

    a = a || [];
    
    というような形で「関数の中で」デフォルト値を代入するテクニックが紹介されていました。 参考にしたRubyのように書ける、と思ったのが間違いの元でした。 そして書きなおしたのが4th.jsです。

  3. については @kaoriya さんがgistへ上げていただいたものでご教示いただけました。

001.jsを読み下ししやすいように三項演算子を解いて書いていただいたのが 002.jsとなります。 この y + x(y - 1); という形に頭が回らなかったことが悔しい次第です。