在Scheme中展平顶级子列表

时间:2018-02-01 09:13:26

标签: list scheme mit-scheme

我正在计划我的第一个项目,并遇到了一个问题。在我的部分要求中,我需要附加所有顶级子列表 (例如'((1 2)(3 4 (5 6))) -> (1 2 3 4 (5 6)) and '((1 2 3)(4 5)) -> (1 2 3 4 5) 我已经设法让它工作到一个列表,但这会使所有级别变平:

 (cond
     ((null? lst)
         lst)        
     ((list? lst)
         (append2(append-subs(car lst))(append-subs(cdr lst))))
     (else
         (cons lst '())))

此变体(例如。(else lst)运行错误"object 6, passed as first arg to cdr, is not correct type"。我尝试的另一种方法如下:

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

哪个无限循环。我有点站着,所以任何帮助都会非常感激。 (注意:禁止使用除此处使用的功能以外的功能。限于列表,列出?,if,cond,null?...)

2 个答案:

答案 0 :(得分:1)

您的列表'(e1 e2 e3)将是这样的:

(cons e1 (cons e2 (cons e3 '())))

或者如果你喜欢点缀符号:

'(e1 . (e2 . (e3 . ())))

en #f#t (list? en) 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) {@ 1}} <div class="ch-rating"> "VERYGOOD 8.37" <div class="star-rating star-rating--alt star-rating--ch" data-rating="8.37" style=""> <span style="width: 83.7%;"></span> </div> </div> .getAttribute() bot.FindElementByXPath("//div[@data-rating]").需要追加两者。

以下是如何使用level作为输入参数来实现它的一般概念:

import getMuiTheme from 'material-ui/styles/getMuiTheme'
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'

答案 1 :(得分:0)

如何附加顶部列表的所有元素:

(define (flatten-top-level lst)
  (apply append lst))

实际上这是 append*

的定义

如果'(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)))

第二个选项:折叠!

(define (flatten-top-level lst)
  (foldr append '() lst))

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

(append a (append b (append c (append d '()))))

额外:这是尾递归,因此在线性时间内运行:)