尝试理解方案中的高阶函数,并且我很难尝试使用这些函数展平列表。 (flatten'(a(b)(c))) - > (a b c)
(define (flatten s)
(cond ((null? s) '())
(foldr (lambda(x) (if (atom? x) (append x)
(list x))) s '())))
(flatten'(a(b)c))返回'()
我不确定如何在这里使用地图,我该如何使用foldl?感谢
答案 0 :(得分:0)
您使用cond
错误。特殊形式的合同是:
(cond
(predicate consequent1 consequent2 ...) ...)
最后一个谓词可能是符号else
。看着你,这就是它的解释:
(cond ((null? s) ; predicate
'()) ; consequent1 (result)
(foldr ; predicate (always true since only #f is false)
(lambda (x) ; consequent1 (dead code)
(if (atom? x)
(append x)
(list x)))
s ; consequent2 (dead code)
'()))) ; consequent3 (result)
正如您所看到的那样,它缺少围绕最后一个术语制作foldr
谓词的括号。即使使用括号,它也缺少else
作为谓词而没有它,fold
仅用于检查它是否不是#f
而不是实际结果。
由于两个术语都向()
发送,而最后一个谓词始终为真()
,因此始终是结果。
使用foldl
您可以按相反的顺序获取元素,但速度会更快。使用foldr
,你可以这样做:
(define (flatten lst)
(let helper ((lst lst) (acc '()))
(foldr (lambda (e acc)
(cond ((null? e) acc)
((pair? e) (helper e acc))
(else (cons e acc))))
acc
lst)))