アロー関数で再帰する方法
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ むずかしい
これまで再帰関数はこんな風につくれました
↑無限ループします
ですが アロー関数は
自身の名前が設定できないので XXX のところに何を書けばいいの ってことになります
アロー関数では arguments も使えません
調べてみると ヘルパ関数を作っておくみたいでした
1 行目が再帰関数を作るヘルパです
引数に自分自身を受け取る関数をこのヘルパ関数に渡せば自身を引数に入れて呼び出してくれます
なかなかに複雑……
単純にループさせる場合はこうなります
引数で自分自身を受け取るのはいいですが 再帰呼び出しでも第一引数に自分を入れないといけないのはちょっとめんどうです
どうせなら 第一引数は自動で入れてもらいたいです
ということでもうひとつ関数を作ります
単純ループなら
できることはわかりましたが 複雑すぎてこっちでいいやとすごく思いました。。。
再帰テクニックとか関数型色が強いですからね
!function recur(){
recur()
}()
recur()
}()
↑無限ループします
ですが アロー関数は
;(() => XXX())()
自身の名前が設定できないので XXX のところに何を書けばいいの ってことになります
アロー関数では arguments も使えません
調べてみると ヘルパ関数を作っておくみたいでした
var rfngen = fn => (...args) => fn(fn, ...args)
var r = rfngen(self => {
setTimeout(_ => self(self), 1000)
console.log(Date.now())
})
r()
var r = rfngen(self => {
setTimeout(_ => self(self), 1000)
console.log(Date.now())
})
r()
1 行目が再帰関数を作るヘルパです
引数に自分自身を受け取る関数をこのヘルパ関数に渡せば自身を引数に入れて呼び出してくれます
なかなかに複雑……
単純にループさせる場合はこうなります
rfngen(self => self(self))()
引数で自分自身を受け取るのはいいですが 再帰呼び出しでも第一引数に自分を入れないといけないのはちょっとめんどうです
どうせなら 第一引数は自動で入れてもらいたいです
ということでもうひとつ関数を作ります
var rfngen = fn => (...args) => fn(fn, ...args)
var maker = fn => rfngen((self, ...args) => fn(self.bind(null, self), ...args))
var r = maker((recur, x) => x <= 0 ? 0 : x + recur(x - 1))
r(3)
// 6
var maker = fn => rfngen((self, ...args) => fn(self.bind(null, self), ...args))
var r = maker((recur, x) => x <= 0 ? 0 : x + recur(x - 1))
r(3)
// 6
単純ループなら
maker(recur => recur())()
できることはわかりましたが 複雑すぎてこっちでいいやとすごく思いました。。。
var r = function recur(x){ return x <= 0 ? 0 : x + recur(x - 1) }
r(3)
// 6
r(3)
// 6
再帰テクニックとか関数型色が強いですからね