Oto odpowiedź podobna do jednej @hvd dostarczonych, ale stosując operator Y
zdefiniowane here ta eliminuje potrzebę zmiennych lokalnych:
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))));
Przykładem stosowanie byłoby:
foreach (var half in halves(20))
Console.WriteLine(half);
Który byłby wyjście 20, 10, 5, 2.5 itd. ...
Nie zaleca się używania tego w kodzie produkcji, ale jest zabawne.
Operator Y
pozwala również inne rekurencyjnych wyrażeń lambda, np:
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);
Dlaczego arbitralne ograniczenie? Czy to zadanie domowe? Jeśli nie jesteś zaangażowany w wyrażane ograniczenia, po prostu napisz iterator za pomocą zwrotu 'yield'' return'. –
Infinite Sequences and Computers nie działają razem. –
@Ramhound Oczywiście, że tak, o ile nie starasz się uzyskać wszystkich przedmiotów. – hvd