2011-01-06 31 views
27

Bir Func temsilcisi ile özyineleme yapmak mümkün mü? sen çünküFunc ile özyineleme

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

Kodunuz bir hata üretir: Ben Func ismi kapsamında olmadığı için derleme değil aşağıdakileri ... Bunun gibi

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

Bu, Mono üzerinde kullanıma hazır olarak çalışır http://www.ienablemuch.com/2010/11/simulate-nested-recursive-function-in-c_08.html –

+0

Bu, http://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas/1079609#1079609 –

cevap

45

var atamadan önce değişkeni kullanmaya çalışın.
Lambda ifadeniz, değişken ayarlanmadan önce derlenir (değişken yalnızca tam bir ifadeye ayarlanabilir), bu nedenle değişkeni kullanamaz.
Değişkeni null olarak ayarlamak öncelikle lambda ifadesi derlendiğinde ayarlanacağı için bu sorunu ortadan kaldırır.

Daha güçlü bir yaklaşım olarak, bir YCombinator kullanabilirsiniz.

+0

+1 İş için. Gerçekten C# 'nun bu yapı olmadan çalışacak kadar "akıllı" olmasını isterdim. (Öte yandan, bazı diller işlevleri ve özyinelemeli işlev bağlamaları için farklı sözdizimine sahiptir.) –

+0

@pst: Genişletilmiş açıklamaya bakın. – SLaks

+0

Bu güzel el çabukluğu, mükemmel çalışıyor! – t3rse