Генерация ленивых списков OcamL
У меня проблема с этой задачей:
- Определите ленивый список lSpec (Ocaml), который содержит один 1, два 2, три 3 и т. Д. 1,2,2,3,3,3,4,4,4,4,5,...
Насколько я получил:
type 'a llist = LNil | LCons of 'a * (unit -> 'a llist);;
let rec lfrom k = LCons (k, function () -> lfrom (k+1));;
let rec ltake = function
(0, _) -> []
| (_, LNil) -> []
| (n, LCons(x,xf)) -> x::ltake(n-1, xf()) ;;
Эта функция генерирует последовательность целых чисел на основе входного числа, например.
ltake (5,lfrom 30);;
- : int list = [30; 31; 32; 33; 34]
То, что я хочу сделать, - это преобразовать функцию lfrom для создания не серии целых чисел, а серии из моей задачи. Но я понятия не имею, есть ли какой-то шаблон для создания таких серий?
Спасибо за помощь заранее.
1 ответ
Код, который вы сейчас используете, использует только одно значение k
отслеживать, где он находится в последовательности. Фундаментально этого будет достаточно для новой проблемы, но использование только одного числа для государства усложнит задачу отслеживания.
Вы можете рассмотреть что-то вроде:
let rec lspecfrom (j, k) = . . .
куда j
номер, с которым вы работаете (1, 2, 3, 4, ...) и k
это сколько было сгенерировано до сих пор. Тогда весь список будет создан путем вызова lspecfrom (1, 0)
,