List 在Scheme中展平顶级子列表

List 在Scheme中展平顶级子列表,list,scheme,mit-scheme,List,Scheme,Mit Scheme,我正在做我在scheme中的第一个项目,遇到了一个问题。在我的部分需求中,我需要附加所有顶级子列表 e、 g.'123456->123456和'12345->123445 我已设法将其下放到一个列表中,但这会使所有级别变得平坦: (cond ((null? lst) lst) ((list? lst) (append2(append-subs(car lst))(append-subs(cdr lst)))) (

我正在做我在scheme中的第一个项目,遇到了一个问题。在我的部分需求中,我需要附加所有顶级子列表 e、 g.'123456->123456和'12345->123445 我已设法将其下放到一个列表中,但这会使所有级别变得平坦:

 (cond
     ((null? lst)
         lst)        
     ((list? lst)
         (append2(append-subs(car lst))(append-subs(cdr lst))))
     (else
         (cons lst '())))
此操作的变体,例如else lst run错误对象6(作为第一个参数传递给cdr)的类型不正确。我尝试的另一种方法如下:

    (cond
        ((null? lst)
            lst)        
        ((>= (len (cdr lst)) 0)
            (append2(append-subs(car (list lst)))(append-subs(cdr (list lst)))))
        (else
            lst)

无限循环。我有点犹豫不决,所以任何帮助都将不胜感激。注:禁止使用此处使用的功能以外的其他功能。仅限于列表、列表?、如果、条件、空

附加列表中的所有元素怎么样:

(define (flatten-top-level lst)
  (apply append lst))
这实际上就是

如果“a b c f”是有效输入,则第一个元素不是列表,然后您可以尝试:

(define (flatten-top-level lst)
  (apply append
         (map (lambda (e) (if (list? e)
                              e 
                              (list e))) ;make a list from the non-list element
         lst)))
第二种选择:折叠它

对于列表a、b、c、d,其中a、b、c、d是子列表;它等于:

(append a (append b (append c (append d '()))))
额外:这是尾部递归,因此在线性时间内运行:

您的列表“e1 e2 e3”如下所示:

(cons e1 (cons e2 (cons e3 '())))
或者,如果您喜欢虚线符号:

'(e1 . (e2 . (e3 . ())))
其中en是列表的f或t?您的任务是将en约束到具有相同级别的递归上,同时使用需要附加这两个元素的列表

以下是如何使用级别作为输入参数来实现它的总体思路:

;;; flatten a list a certain levels
;;; level of zero is identity
(define (flatten-level level lst)
  (cond ((or (zero? level)
             (null? lst))
         lst)
        ;; pair? is faster but will fall through for dotted
        ((list? (car lst)) 
         (append (flatten-level <??> <??>)
                 (flatten-level <??> <??>)))
        (else 
         (cons <??>
               (flatten-level <??> <??>)))))

(flatten-level 0  '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> ((1 2) (3 (((4 . 3))) (5 (6))) . 7) (aka identity)
(flatten-level 1  '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> (1 2 3 (((4 . 3))) (5 (6)) . 7)
(flatten-level 99 '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> (1 2 3 (4 . 3) 5 6 . 7)

谢谢你的回复!不幸的是,虽然我已经探索了map和apply的用法,但在我的解决方案中不允许使用这两种方法。但是,所有输入元素都将包含在列表中,因此您的第一个建议更适用。您是否可以使用foldr?似乎不是,不是。。我可以创建自己的助手函数,但不允许使用其他Scheme函数,哈哈。我的大脑,这段代码我已经写了很多次了。我刚刚看到了你的更新,foldr也不被允许。真头痛!非常感谢。这是毫无意义的:汽车列表lst==lst,也就是cdr列表lst='
;;; flatten a list a certain levels
;;; level of zero is identity
(define (flatten-level level lst)
  (cond ((or (zero? level)
             (null? lst))
         lst)
        ;; pair? is faster but will fall through for dotted
        ((list? (car lst)) 
         (append (flatten-level <??> <??>)
                 (flatten-level <??> <??>)))
        (else 
         (cons <??>
               (flatten-level <??> <??>)))))

(flatten-level 0  '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> ((1 2) (3 (((4 . 3))) (5 (6))) . 7) (aka identity)
(flatten-level 1  '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> (1 2 3 (((4 . 3))) (5 (6)) . 7)
(flatten-level 99 '((1 2)(3 (((4 . 3))) (5 (6))) . 7))
; ==> (1 2 3 (4 . 3) 5 6 . 7)