Scheme 有人能解释一下下面的方案代码吗?
我一直在听斯坦福的,但我被下面的代码(来自第20课)弄糊涂了。有人能逐行解释一下这是怎么回事吗 谢谢Scheme 有人能解释一下下面的方案代码吗?,scheme,Scheme,我一直在听斯坦福的,但我被下面的代码(来自第20课)弄糊涂了。有人能逐行解释一下这是怎么回事吗 谢谢 (define (flatten sequence) (cond ((null? sequence) '()) ((list? (car sequence)) (append (flatten (car sequence)) (flatten (cdr sequence)))) (
(define (flatten sequence)
(cond ((null? sequence) '())
((list? (car sequence)) (append (flatten (car sequence))
(flatten (cdr sequence))))
(else (cons (car sequence)
(flatten (cdr sequence))))))
我很好地打印了它(插入一些换行符并缩进代码以显示其结构),还将'()
替换为(列表)
(具有相同的值),只是为了防止代码被错误地突出显示
+1.什么是竞争?如果您能解释一下其他关键词,我将不胜感激。谢谢 当我说cons ing时,我只是指
cons
过程。当您看到(cons)
其中
是任何方案表达式或值,
是任何计算结果为列表的方案表达式时,cons
将返回
,并在其前面加上
的值。例如,(cons1(list 2 3 4))
返回列表(list 1 2 3 4)
。事实上,Scheme中的(列表1234)
只是编写(cons1(cons2(cons3)(cons4’()))
的一种简短方式
另外两个您可能遇到问题的词是car
和cdr
。您可以将(car)
视为
的第一个元素或头部,将(cdr)
视为
的其余元素或尾部。例如,(car(列表1234))
返回值1
,(cdr(列表1234))
返回列表(列表1234)
如果你需要其他关键字的帮助,请告诉我
哦,刚刚记住,方案注释以分号开头。但是当我把八角形改为分号时,突出显示会变得混乱…+1什么是矛盾?如果您能解释一下其他关键词,我将不胜感激。谢天谢地@Jeremy Ruten——你似乎对这个计划了如指掌!我怀念大学时代的计划
# 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))))))