這是我當前的代碼:現在ES6立即調用遞歸Arrow功能
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
,我不能用this approach,因爲我需要調用帶有參數的功能,它必須是可調用的遞歸。
如何重構上述箭頭函數以立即調用並遞歸調用?
這是我當前的代碼:現在ES6立即調用遞歸Arrow功能
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
,我不能用this approach,因爲我需要調用帶有參數的功能,它必須是可調用的遞歸。
如何重構上述箭頭函數以立即調用並遞歸調用?
如果你想調用遞歸的lambda expression
或你需要Y combinator。有關詳細信息,你可以閱讀http://mvanier.livejournal.com/2897.html
對於階乘是喜歡
var Y = (proc) => {
return ((x) => {
return proc((y) => { return (x(x))(y);});
})((x) => {
return proc((y) => { return (x(x))(y);});
});
};
var factorial = (fact) => {
return (n) => {
return (n === 0) ? 1 : n * fact(n-1);
};
};
console.log(Y(factorial)(5));
對於你的代碼就會像
const fn = (func)=> {
return (parameter) => {
// if else
func(X);
}
};
Y(fn)(0);
這可能是對的,但這不是自調用的。我想刪除'Y(fn)(0);'。這個解決方案似乎更復雜,但像我的結果一樣。 – user3292653
首先,讓我把免責聲明立即調用函數表達式(IIFE)在ES6中是considered bad practice,並且這是尾隨式發生的離子和個人,我會改變它爲一個for循環。
但你總是可以做到這一點我想:
((x) =>{ const fn=(p)=>{
//whatever
fn(q)
}
fn(x)
})(0)
JavaScript提供了遞歸函數一個很好的解決方案:有名函數表達式。因此,我會建議使用,而不是箭頭功能:
(function fn(parameter) {
// if, else ...
fn(x);
})(0);
偉大的答案。表明箭頭函數並不總是比命名函數表達式更好。 – Reza
不要使用箭頭功能? –