给出,
reduce
列表的长度可以用(define (mylength lis) (reduce (lambda (x n) (+ 1 n)) 0 lis)).
来定义(而不是
使用从头开始的递归定义)
mymap
定义列表函数map
(类似于uf
),它采用一元函数lis
和列表f
就减少而言,即通过确定
id
和(mymap uf lis) = (reduce f id lis),
mymap
回想一下(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6)
返回一个列表,该列表是在输入列表中的每个元素上调用函数,例如{{1}}。
对如何做到这一点的一点解释将是有帮助的,而不是一个公然的答案。谢谢。
答案 0 :(得分:1)
我们有
(mymap uf lis) = (reduce f id lis) =
= (if (null? lis) id
(f (car lis) (reduce f id (cdr lis))))
必须等于
= (if null? lis) '()
(cons (uf (car lis)) (mymap uf (cdr lis))))
匹配相应的实体,我们得到
id == '()
并且,自(mymap uf lis) = (reduce f id lis)
起,它也是(mymap uf (cdr lis)) = (reduce f id (cdr lis))
,所以我们有
(f x y) = (cons (uf x) y)
因此,我们定义
(define (mymap uf xs) ; multiple `x`-es :)
(reduce (lambda (x r)
(cons .... r))
'()
xs ))
你的reduce
是right fold:它的组合函数接收参数列表x
的元素xs
,以及处理列表其余部分的递归结果,为r
。
r
包含其余xs
的所有元素,这些元素已经通过uf
进行了映射。剩下要做的就是将给定元素x
与此递归结果r
合并,将cons
(uf x)
转移到r
。
现在通过编写实际代码代替点....
来完成定义应该没有问题。