階乗です。普通に書けばこういうものです。
const fact = x =>
x===0 ? 1
: x * fact( x - 1 )
無名再帰っぽくしてみます。
Python : lambdaの中でも再帰できた
これにのっとってJavaScriptでも階乗を書いてみました。
const fact = x =>
( f => f( f )( x ) )( f => x => x == 0 ? 1 : x * f( f )( x - 1 ));
//またはデフォルト引数を使って
const fact =
(x, f = f => x => x == 0 ? 1 : x * f(f)(x - 1)) => f(f)(x)
;
//使用例:
fact(5)
//=> 120
使えてはいます。でもちょっと何いってんのかわかりにくい。
#こんな風にしとけばわかりやすい?
再帰させる仕組みと、再帰する元になる条件分岐の式と、機能でわけます。あとで合成。
const recurse = f => f(f) //再帰させる仕組み
const factSeed = f => x => x===0 ? 1 : x * f(f)(x-1) //再帰する元になる関数
const fact = recurse(factSeed);
fact(5); //120
使い回せそう。
早速使ってみました。JavaScript:カリー化してくれる関数#追記
ちょっと複雑ですが、ちゃんと使い回せているようです。
でも普通ので十分かな。