讓我們把問題分成兩部分。
首先,讓我們假設將列表中的程序,並返回結果如下:
- 含各子表
- 包含的每個子表的剩餘列表的第一項的列表
- 非空列表的數目遇到
示例實現可能是:
(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 '())
'()