javascript 再帰で平均を求める

ちょっと魔術っぽいコードになる。

rollDice = n => _ => Math.floor(Math.random() * n) + 1;
average = (f, n) => n == 1 ? f() : (average(f, n-1) * (n-1) + f()) / n;
console.log( average(rollDice(6), 1000) ); // →だいたい3.5くらい