2011-01-06 16 views
27

Czy można wykonywać rekursję z delegatem Func? Mam następujące dane, które nie kompiluje ponieważ nazwa FUNC nie jest w zakresie ...Rekursja z Func

Func<long, long, List<long>, IEnumerable<long>> GeneratePrimesRecursively = (number, upperBound, primeFactors) => 
{ 
    if (upperBound < number) 
    { 
     return primeFactors; 
    } 
    else 
    { 
     if (!primeFactors.Any(factor => number % factor == 0)) primeFactors.Add(number); 
     return GeneratePrimesRecursively(++number, upperBound, primeFactors); // breaks here. 
    } 
}; 
+0

To działa natychmiast po uruchomieniu na Mono http://www.ienablemuch.com/2010/11/simulate-nested-recursive-function-in-c_08.html –

+0

To jest duplikat http://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas/1079609#1079609 –

Odpowiedz

45

tak:

Func<...> method = null; 
method = (...) => { 
    return method(); 
}; 

Twój kod generuje błąd, ponieważ jesteś próbuje użyć zmiennej przed jej przypisaniem.
Twoje wyrażenie lambda jest kompilowane przed ustawieniem zmiennej (zmienna może być ustawiona tylko na pełne wyrażenie), więc nie może używać zmiennej.
Po ustawieniu zmiennej na null najpierw unika się tego problemu, ponieważ zostanie ona już ustawiona po skompilowaniu wyrażenia lambda.

Jako mocniejsze podejście można użyć numeru YCombinator.

+0

+1 Do pracy. Naprawdę chciałbym, żeby C# był na tyle "inteligentny", by pracować bez tej konstrukcji. (Z drugiej strony, niektóre języki mają różną składnię dla funkcji i powiązań funkcji rekursywnej). –

+0

@pst: Zobacz moje rozwinięte wyjaśnienie. – SLaks

+0

To piękna sztuczka, działa idealnie! – t3rse