方案中正常列表的列表列表

时间:2017-06-25 22:41:31

标签: scheme racket

我正在尝试创建一个scheme函数,该函数返回列表列表对中的“普通”列表。

我正在尝试改变这样的事情:

((((((() 1) 2) 3) 4) (12 13 14)) ((((() 8) 9) 10) 11) (5 6 7))

这样的事情:

(1 2 3 4 12 13 14 8 9 10 11 5 6 7)

我尝试过使用尾递归,但我的代码只返回相同的初始对。

然后我做了这个,但它也没有用,有点洗牌:

(define (tolist l1 lista)
   (if (empty? (cdr lista))
        null
        (if (empty? (car lista))
            (append l1 (cdr lista))
            (tolist (append l1 (car lista)) (list (cdr lista)) ))))

我该怎么办?

1 个答案:

答案 0 :(得分:0)

奥斯卡·洛佩兹给了你一个很好的答案,虽然我会用列表测试l1?而不是配对?,因为他的代码(flatten'(1.2))会产生(1 2),这可能不是你想要的结果。

通过这种修正,他的代码可以变成一个折叠:

(define (flatten seq)
  (letrec ((flatten-with-append
             (lambda (elt acc) ;; args as for SRFI-1 fold
               (if (list? elt)
                   (fold flatten-with-append acc elt)
                   (append acc (list elt))))))
    (flatten-with-append seq '())))

这种做法的一个问题是它附加,这不是很有效。通常更好地进入累加器然后反转。这可能会更加优化:

(define (flatten seq)
  (letrec ((flatten-with-cons
             (lambda (elt acc) ;; args as for SRFI-1 fold
               (if (list? elt)
                   (fold flatten-with-cons acc elt)
                   (cons elt acc)))))
    (reverse (flatten-with-cons seq '()))))