给予,
(define (reduce f id lis)
(if (null? lis) id
(f (car lis) (reduce f id (cdr lis)))))列表的长度可以用reduce (而不是从头开始使用递归定义)定义为
(define (mylength lis) (reduce (lambda (x n) (+ 1 n)) 0 lis)).定义列表函数mymap (类似于map),该函数接受一个一元函数uf和list lis,即通过在
(mymap uf lis) = (reduce f id lis),回想一下,mymap返回由于调用输入列表中的每个元素(如(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6) )上的函数而产生的列表。
对如何做到这一点作出一点解释将是有益的,而不是一个明目张胆的回答。谢谢。
发布于 2015-10-22 00:24:07
我们有
(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是一个右褶皱:它的组合函数接收参数列表xs的元素x,以及处理列表其余部分的递归结果,如r。
r拥有xs其余部分的所有元素,这些元素已经通过uf映射。要将给定元素x与这个递归结果r组合在一起,所要做的就是将(uf x) cons到r上。
现在,通过编写实际代码来完成定义应该没有问题,而不是点....。
https://stackoverflow.com/questions/33270902
复制相似问题