यहाँ एक जवाब प्रदान की एक @hvd के समान है, लेकिन का उपयोग कर Y
ऑपरेटर परिभाषित here, इस स्थानीय चर के लिए की जरूरत को हटा:
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))));
एक उदाहरण उपयोग होगा:
foreach (var half in halves(20))
Console.WriteLine(half);
कौन सा होगा उत्पादन 20, 10, 5, 2.5 आदि ...
मैं उत्पादन कोड में इस का उपयोग करते हुए सलाह नहीं होगा, लेकिन यह मजेदार है।
Y
ऑपरेटर भी अनुमति देता है अन्य पुनरावर्ती लैम्ब्डा अभिव्यक्ति, उदाहरण के लिए:
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);
क्यों मनमाने ढंग से प्रतिबंध? क्या यह होमवर्क है? यदि आप अपनी व्यक्त सीमाओं के प्रति प्रतिबद्ध नहीं हैं, तो बस 'उपज' 'वापसी 'का उपयोग करके एक पुनरावर्तक लिखें। –
अनंत अनुक्रम और कंप्यूटर एक साथ काम नहीं करते हैं। –
@Ramhound निश्चित रूप से वे करते हैं, जब तक आप सभी वस्तुओं को प्राप्त करने की कोशिश नहीं करते हैं। – hvd