Dưới đây là một câu trả lời tương tự như một @hvd cung cấp, nhưng sử dụng các nhà điều hành Y
định nghĩa here, điều này loại bỏ sự cần thiết của các biến địa phương:
public static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f)
{
return t => f(Y(f))(t);
}
var halves = Y<double, IEnumerable<double>>(self => d => new[] { 0d }.SelectMany(_ => new[] { d }.Concat(self(d/2))));
Một sử dụng ví dụ sẽ là:
foreach (var half in halves(20))
Console.WriteLine(half);
Điều gì sẽ xuất 20, 10, 5, 2.5 v.v.
Tôi sẽ không khuyên bạn sử dụng mã này trong mã sản xuất nhưng thật thú vị.
Nhà điều hành Y
cũng cho phép biểu thức lambda đệ quy khác, ví dụ:
var fibonacci = Y<int, int>(self => n => n > 1 ? self(n - 1) + self(n - 2) : n);
var factorial = Y<int, int>(self => n => n > 1 ? n * self(n - 1) : n);
var hanoi = Y<int, int>(self => n => n == 1 ? 1 : 2 * self(n - 1) + 1);
Tại sao những hạn chế tùy tiện? Đây có phải là bài tập về nhà không? Nếu bạn không cam kết với các giới hạn được thể hiện của mình, chỉ cần viết một trình lặp bằng cách sử dụng 'yield'' return'. –
Chuỗi vô hạn và Máy tính không hoạt động cùng nhau. –
@Ramhound Chắc chắn họ làm, miễn là bạn không cố gắng để có được tất cả các mặt hàng. – hvd