我一直在听斯坦福大学的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))))))
答案 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 '() ))))
的简短方法。
您可能遇到的其他两个字词是car
和cdr
。您可以将(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)
定义函数以展平a 序列
对于空序列,返回空
如果列表的头(车)是a 序列返回结果 压扁它附加到 尾部扁平(cdr)
否则将头部贴在平坦处 尾巴