2016-08-15 72 views
8

這是我當前的代碼:現在ES6立即調用遞歸Arrow功能

const fn = parameter => { 
    // if, else ... 
    fn(X); 
}; 
fn(0); 

,我不能用this approach,因爲我需要調用帶有參數的功能,它必須是可調用的遞歸。

如何重構上述箭頭函數以立即調用並遞歸調用?

+0

不要使用箭頭功能? –

回答

2

如果你想調用遞歸的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); 
+0

這可能是對的,但這不是自調用的。我想刪除'Y(fn)(0);'。這個解決方案似乎更復雜,但像我的結果一樣。 – user3292653

9

首先,讓我把免責聲明立即調用函數表達式(IIFE)在ES6中是considered bad practice,並且這是尾隨式發生的離子和個人,我會改變它爲一個for循環。

但你總是可以做到這一點我想:

((x) =>{ const fn=(p)=>{ 
     //whatever 
     fn(q) 
    } 
    fn(x) 
})(0) 
5

JavaScript提供了遞歸函數一個很好的解決方案:有名函數表達式。因此,我會建議使用,而不是箭頭功能:

(function fn(parameter) { 
    // if, else ... 
    fn(x); 
})(0); 
+0

偉大的答案。表明箭頭函數並不總是比命名函數表達式更好。 – Reza