【问题标题】:Flattening a list in scheme展平方案中的列表
【发布时间】:2016-01-25 02:23:26
【问题描述】:

我正在尝试在方案中创建一个用于扁平化 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))))))

【问题讨论】:

标签: list scheme flatten


【解决方案1】:

这显示了如何将 Ó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))))

通过有效地对我们的堆栈进行尾调用优化,消除了一些无用的consing。可以进一步优化对一个元素列表的处理。

【讨论】:

    【解决方案2】:

    如果你想展平列表列表,那么你必须使用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)
    

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 2012-11-12
      • 2012-03-19
      • 2018-04-15
      • 1970-01-01
      • 2021-09-07
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多