Мне нравится определять последовательности рекурсивно следующим образом:
let rec startFrom x =
seq {
yield x;
yield! startFrom (x + 1)
}
Я не уверен, что на практике должны использоваться рекурсивные последовательности. yield!
кажется хвостом рекурсивным, но я не уверен на 100%, так как он вызывается из другого IEnumerable. С моей точки зрения, код создает экземпляр IEnumerable при каждом вызове, не закрывая его, что фактически заставляет эту функцию также утечки памяти.
Будет ли эта функция утечки памяти? В этом отношении даже "хвост рекурсивный"?
[Edit to add]: Я пытаюсь ответить с NProf, но я думаю, что было бы полезно получить техническое объяснение относительно реализации рекурсивных последовательностей на SO.