竹内関数といえばベンチマークによく使われる関数です。普通に書くと爆発的な回数の関数呼び出しが発生します。 function tarai(x, y, z) { if (x <= y) { return y; } else { return tarai( tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y) ); } } 例えばtarai(10,5,1)なら55229回、tarai(15,5,1)だと実に356426301回もの関数コールが発生します。 竹内関数を高速に解くには、メモ化と遅延評価が知られています。メモ化については解説も多いので、ここでは遅延評価での解き方を考えます。 JavaScriptは先行評価の言語ですので、無理やり遅延評価を行うにはクロージャで引数をラップすることになります。 function tarai(x
![CoffeeScriptで竹内関数を解く](https://cdn-ak-scissors.b.st-hatena.com/image/square/126e9c63960837b5815901e11e1f6c1303c17f2b/height=288;version=1;width=512/https%3A%2F%2Fblog.seesaa.jp%2Fimg%2Fogp_logo.png)