2011-01-06 41 views
27

Có thể thực hiện đệ quy với đại biểu Func không? Tôi có những điều sau đây, mà không biên dịch vì tên của Func không nằm trong phạm vi ...Đệ quy với 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

Hoạt động ngoài hộp trên Mono http://www.ienablemuch.com/2010/11/simulate-nested-recursive-function-in-c_08.html –

+0

Đây là bản sao của http://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas/1079609#1079609 –

Trả lời

45

Như thế này:

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

Mã của bạn tạo ra một lỗi bởi vì bạn cố gắng sử dụng biến trước khi bạn gán nó.
Biểu thức lambda của bạn được biên dịch trước khi biến được đặt (biến chỉ có thể được đặt thành một biểu thức hoàn chỉnh), do đó, nó không thể sử dụng biến.
Đặt biến thành null trước tiên tránh vấn đề này, vì nó sẽ được đặt khi biểu thức lambda được biên dịch.

Là một cách tiếp cận mạnh mẽ hơn, bạn có thể sử dụng YCombinator.

+0

+1 Dành cho công việc. Tôi thực sự muốn C# là "thông minh", đủ để làm việc mà không có cấu trúc này mặc dù. (Mặt khác, một số ngôn ngữ có cú pháp khác nhau cho các hàm và các ràng buộc hàm đệ quy.) –

+0

@pst: Xem giải thích mở rộng của tôi. – SLaks

+0

Đó là kiểu dáng đẹp của bàn tay, hoạt động hoàn hảo! – t3rse