有人可以解释下面的Scheme代码吗?

时间:2009-10-03 23:15:39

标签: scheme

我一直在听斯坦福大学的programming paradigm lecture series,但我对下面的代码感到困惑(来自第20讲)。有人会逐行解释这是做什么的吗?

感谢。

(define (flatten sequence)
  (cond ((null? sequence) '())
        ((list? (car sequence)) (append (flatten (car sequence))
                                        (flatten (cdr sequence))))
        (else (cons (car sequence)
                    (flatten (cdr sequence))))))

2 个答案:

答案 0 :(得分:7)

# define a procedure 'flatten' that takes a list 'sequence'
(define (flatten sequence)
  # if the 'sequence' is empty, return an empty list
  (cond ((null? sequence) (list))
        # if the first element of 'sequence' is itself a list, return a new list
        # made by appending the flattened first element of 'sequence' with the
        # flattened rest of the 'sequence'
        ((list? (car sequence))
         (append (flatten (car sequence))
                 (flatten (cdr sequence))))
        # if the first element of 'sequence' is not a list, return a new list
        # made by cons-ing that element with the flattened rest of the 'sequence'
        (else
         (cons (car sequence)
               (flatten (cdr sequence))))))

我漂亮地打印它(插入一些换行符并缩进代码以显示其结构)并将'()替换为(list)(具有相同的值)以防止代码被突出显示不正确。

  

+1什么是供应?如果您解释其他关键字,我将不胜感激。感谢

当我说收集时,我只是提到cons程序。当您看到(cons <expression> <list>)其中 <expression> 是任何Scheme表达式或值而 <list> 是任何计算表达式的Scheme表达式时, cons将返回 <list> ,并在其前面加上 <expression> 的值。例如,(cons 1 (list 2 3 4))会返回列表(list 1 2 3 4)。事实上,Scheme中的(list 1 2 3 4)只是编写(cons 1 (cons 2 (cons 3 (cons 4 '() ))))的简短方法。

您可能遇到的其他两个字词是carcdr。您可以将(car <list>)视为 <list> 第一个元素或 head ,以及{{1} }表示 (cdr <list>) rest 元素或 tail 。例如,<list>返回值(car (list 1 2 3 4))1返回列表(cdr (list 1 2 3 4))

如果您需要其他关键字的帮助,请与我们联系。

答案 1 :(得分:1)

  1. 定义函数以展平a 序列

  2. 对于空序列,返回空

  3. 如果列表的头(车)是a 序列返回结果 压扁它附加到 尾部扁平(cdr)

  4. 否则将头部贴在平坦处 尾巴