use*_*653 11 javascript recursion ecmascript-6 arrow-functions
这是我目前的代码:
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
Run Code Online (Sandbox Code Playgroud)
现在,我不能使用这种方法,因为我需要使用参数调用函数,并且它必须可递归地调用.
如何重构上面的箭头函数,以便立即调用和递归调用?
Rez*_*eza 11
首先,让我把免责声明立即调用函数表达式(IIFE)视为 ES6中的不良实践,这是尾递归,我个人将其更改为for循环.
但你总能这样做我猜:
((x) =>{ const fn=(p)=>{
//whatever
fn(q)
}
fn(x)
})(0)
Run Code Online (Sandbox Code Playgroud)
Fel*_*ing 11
JavaScript为递归函数提供了一个很好的解决方案:命名函数表达式.因此我建议使用它而不是箭头功能:
(function fn(parameter) {
// if, else ...
fn(x);
})(0);
Run Code Online (Sandbox Code Playgroud)
如果你想调用递归lambda expression或者anonymous function你需要Y 组合器。欲了解更多详细信息,您可以阅读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) );Run Code Online (Sandbox Code Playgroud)
对于你的代码来说它会像
const fn = (func)=> {
return (parameter) => {
// if else
func(X);
}
};
Y(fn)(0);
Run Code Online (Sandbox Code Playgroud)