List 在scheme中展平列表
我正试图在scheme中用R5RS语言创建一个用于平展列表的函数,但遇到了一个问题,即我的函数只返回输入列表而不删除括号。我认为这是由于额外的缺点,但当我删除它时,输出将成为列表,而不包含括号中的元素。有人能给我指出正确的方向吗List 在scheme中展平列表,list,scheme,flatten,List,Scheme,Flatten,我正试图在scheme中用R5RS语言创建一个用于平展列表的函数,但遇到了一个问题,即我的函数只返回输入列表而不删除括号。我认为这是由于额外的缺点,但当我删除它时,输出将成为列表,而不包含括号中的元素。有人能给我指出正确的方向吗 (define (denestify lst) (cond ((null? lst)'()) ((list? (car lst))(cons (denestify (cons (car (car lst))(cdr (car lst))))
(define (denestify lst)
(cond ((null? lst)'())
((list? (car lst))(cons (denestify (cons (car (car lst))(cdr (car lst))))
(denestify (cdr lst))))
(else (cons (car lst)(denestify (cdr lst))))))
如果要展平列表列表,则必须使用append
组合每个子列表。此外,您的实现过于复杂,请尝试以下方法:
(define (denestify lst)
(cond ((null? lst) '())
((pair? (car lst))
(append (denestify (car lst))
(denestify (cdr lst))))
(else (cons (car lst) (denestify (cdr lst))))))
例如:
(denestify '(1 (2 (3 4 (5) (6 (7) (8)) (9))) 10))
=> '(1 2 3 4 5 6 7 8 9 10)
这显示了如何将Óscar López答案转换为不使用
append
且也是尾部递归的答案:
(define (denestify-helper lst acc stk)
(cond ((null? lst)
(if (null? stk) (reverse acc)
(denestify-helper (car stk) acc (cdr stk))))
((pair? (car lst))
(denestify-helper (car lst) acc (cons (cdr lst) stk)))
(else
(denestify-helper (cdr lst) (cons (car lst) acc) stk))))
(define (denestify lst) (denestify-helper lst '() '()))
(denestify '(1 (2 (3 4 (5) (6 (7) (8)) (9))) 10))
请注意它是如何使用累加器反向构建列表以及作为堆栈的列表的
导致
'(1 2 3 4 5 6 7 8 9 10)
正如所料
在我发布这篇文章后,我想到了这个变化:
(define (denestify-helper lst acc stk)
(cond ((null? lst)
(if (null? stk) (reverse acc)
(denestify-helper (car stk) acc (cdr stk))))
((pair? (car lst))
(denestify-helper (car lst) acc (if (null? (cdr lst))
stk
(cons (cdr lst) stk))))
(else
(denestify-helper (cdr lst) (cons (car lst) acc) stk))))
通过在堆栈上有效地进行尾部调用优化,消除了一些无用的
缺点。我们可以进一步优化单元素列表的处理。另请参见:@coredump我得到了一个断开的链接