List 在scheme中展平列表

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))))

我正试图在scheme中用R5RS语言创建一个用于平展列表的函数,但遇到了一个问题,即我的函数只返回输入列表而不删除括号。我认为这是由于额外的缺点,但当我删除它时,输出将成为列表,而不包含括号中的元素。有人能给我指出正确的方向吗

(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我得到了一个断开的链接