我正在尝试创建一个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)) ))))
我该怎么办?
答案 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 '()))))