【问题标题】:Is there any built-in function to extract elements from list in Scheme?是否有任何内置函数可以从 Scheme 中的列表中提取元素?
【发布时间】:2020-03-29 07:14:33
【问题描述】:

有什么功能可以改造

'((0 0 0) (4 0 0) (2 7 0)) 变成'(0 0 0 4 0 0 2 7 0)

【问题讨论】:

    标签: list functional-programming scheme racket


    【解决方案1】:

    您要查找的操作称为flatten,它将展平所有子列表,无论它们的嵌套级别如何:

    (flatten '((0 0 0) (4 0 0) (2 7 0)))
    

    如果您的解释器不支持它,通常的实现方式(对于一层嵌套)是:

    (apply append '((0 0 0) (4 0 0) (2 7 0)))
    

    或者像这样,对于任意嵌套的列表(这就是内置的flatten 的工作方式):

    (define (flatten lst)
      (cond ((null? lst) '())
            ((pair? lst)
             (append (flatten (car lst)) (flatten (cdr lst))))
            (else (list lst))))
    

    无论如何,它按预期工作:

    '(0 0 0 4 0 0 2 7 0)
    

    【讨论】:

      【解决方案2】:

      你是对的,我必须实现它。这个适用于示例

      (define (extract lista)
         (if (equal? lista empty) '() (append (car lista) (extract(cdrlista)))))
      

      【讨论】:

        【解决方案3】:

        标准方案(n 的某些定义为 RnRS)不提供这样的功能,但您想要做的通常称为flatten,并且在许多方案库中都可用。如果这是家庭作业,我不会提供代码,但这里有一个框架可以帮助您入门:

        (define (flatten xs)
          (cond ((null? xs) ...)
                ((pair? xs)
                  (append (flatten ...)
                          (flatten ...)))
                (else ...)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-13
          相关资源
          最近更新 更多