我正在尝试使用Map / Foldl / Foldr
查找列表的长度(define (suml lst)
(length lst))
Input : (suml '(1 2 3))
Output : 3
Input : (suml '(((((2)))) (1)))
Output: 2
如何使用foldl / map / foldr修改它?
答案 0 :(得分:2)
正如评论中所提到的,map采用了一个函数并以元素方式应用它。使用map的函数将创建相同长度的列表。要创建长度函数,我们将列表压缩为单个值。这是折叠的目的。
(define (length l)
(foldr (lambda (_ cur-length) (+ 1 cur-length)) 0 l))
当你考虑foldr时,你应该考虑将它替换为带有函数的列表中的cons和带有基本案例参数的空列表。请看以下示例:
'(1 2 3 4)
= (cons 1 (cons 2 (cons 3 (cons 4 '()))))
(foldr f base '(1 2 3 4))
= (f 1 (f 2 (f 3 (f 4 base))))
事实证明,foldl也适用于这种情况,因为我们只为每个元素添加一个,如果我们从左到右或从右到左都没关系。
(define (length l)
(foldl (lambda (_ cur-length) (+ 1 cur-length)) 0 l))