Генерация ленивых списков 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),

Другие вопросы по тегам