2016-08-15 32 views

Odpowiedz

2

Jeśli chcesz zadzwonić na numer rekurencyjny lambda expression lub , potrzebujesz Y combinator. Aby uzyskać więcej informacji można przeczytać http://mvanier.livejournal.com/2897.html

dla silnia to jak

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));

dla kodować to będzie jak

const fn = (func)=> { 

    return (parameter) => { 
     // if else 
     func(X); 
    } 
}; 

Y(fn)(0); 
+0

Może to być prawda, ale nie jest to samo wywołanie. Chciałbym usunąć 'Y (fn) (0);'. To rozwiązanie wydaje się być bardziej złożone, ale z takim samym skutkiem jak mój. – user3292653

9

pierwsze, chciałbym umieścić zastrzeżenie że Natychmiastowe Wywoływanie Funkcji Wyrażeń (IIFE) są w ES6 considered bad practice, a to jest powtarzanie I osobiście zmienilbym go na pętlę for.

ale zawsze można to zrobić Chyba:

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

JavaScript zapewnia doskonałe rozwiązanie dla funkcji rekurencyjnych: nazwie funkcja wyrażenia. W związku z tym polecam użyć zamiast funkcji strzałki:

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

świetna odpowiedź. pokazuje, że funkcje strzałek nie zawsze są lepsze od nazwanych funkcji. – Reza