让我们把问题分成两部分。
首先,让我们假设将列表中的程序,并返回结果如下:
- 含各子表
- 包含的每个子表的剩余列表的第一项的列表
- 非空列表的数目遇到
示例实现可能是:
(define (split-tuples lst)
(let loop ((lst lst) (fst null) (rst null) (cnt 0))
(if (null? lst)
(values (reverse fst) (reverse rst) cnt)
(let ((c (car lst)))
(if (null? c)
(loop (cdr lst) (cons c fst) (cons c rst) cnt)
(loop (cdr lst) (cons (car c) fst) (cons (cdr c) rst) (add1 cnt)))))))
测试:
> (split-tuples '((m n o) (1) (x y)))
'(m 1 x)
'((n o)() (y))
3
> (split-tuples '((n o)() (y)))
'(n() y)
'((o)()())
2
> (split-tuples '((o)()()))
'(o()())
'(()()())
1
> (split-tuples '(()()()))
'(()()())
'(()()())
0
现在用这个过程中,我们创建的主要过程,将只是循环,直到所有子列表为空:
(define (list-tuples lst)
(let loop ((lst lst) (res null))
(let-values (((fst rst cnt) (split-tuples lst)))
(if (zero? cnt)
(reverse res)
(loop rst (cons fst res))))))
测试:
> (list-tuples '((m n o) (1) (x y)))
'((m 1 x) (n() y) (o()()))
> (list-tuples '())
'()