Вы могли бы сэкономить, разработав функцию, которая вычисляет состояние для следующей итерации на 4-кортеже. Затем функцию генератора последовательности Seq.unfold
можно использовать для построения последовательности, содержащей первый элемент каждого четверки состояний, «ленивая» операция - элементы последовательности вычисляются только по требованию по мере их использования.
let tetranacci (a3, a2, a1, a0) = a2, a1, a0, a3 + a2 + a1 + a0
(0, 1, 1, 2)
|> Seq.unfold (fun (a3, _, _, _ as a30) -> Some(a3, tetranacci a30))
|> Seq.take 10
|> Seq.toList
// val it : int list = [0; 1; 1; 2; 4; 8; 15; 29; 56; 108]
Обратите внимание, что стандартная последовательность Tetranacci ( OEIS A000078 ) обычно генерируется с начальным состоянием (0, 0, 0, 1)
:
// val it : int list = [0; 0; 0; 1; 1; 2; 4; 8; 15; 29]