我有一个惰性列表界面,我正在尝试使用它来构建一个给定列表的子集的惰性列表。
界面:
(define cons-lzl cons)
(define empty-lzl empty)
(define empty-lzl? empty?)
(define head car)
(define tail
(lambda (lz-lst)
((cdr lz-lst))))
目标是让函数生成一个惰性列表,并在需要时使用 take 函数获取给定数量的子集。
我的拍摄功能:
(define take
(lambda (lz-lst n)
(if (or (= n 0) (empty-lzl? lz-lst))
empty-lzl
(cons (head lz-lst)
(take (tail lz-lst) (- n 1))))))
测试用例:
(take (all-subs '(1 2 3)) 8) ->
'(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))
我看到它的方式有几个步骤:
- 检查列表是否为空 - 如果是,则返回构造的空惰性列表。
- 如果列表不为空,则返回带有 car 元素的惰性列表,并使用 cdr 元素再次调用 all-subs。
我该如何进行?