首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高阶函数

高阶函数
EN

Stack Overflow用户
提问于 2015-10-21 23:22:01
回答 1查看 271关注 0票数 0

给予,

代码语言:javascript
复制
(define (reduce f id lis)
    (if (null? lis) id
      (f (car lis) (reduce f id (cdr lis)))))

列表的长度可以用reduce (而不是从头开始使用递归定义)定义为

代码语言:javascript
复制
(define (mylength lis) (reduce  (lambda (x n) (+ 1 n)) 0 lis)).

定义列表函数mymap (类似于map),该函数接受一个一元函数uf和list lis,即通过在

代码语言:javascript
复制
(mymap uf lis) = (reduce f id lis),

回想一下,mymap返回由于调用输入列表中的每个元素(如(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6) )上的函数而产生的列表。

对如何做到这一点作出一点解释将是有益的,而不是一个明目张胆的回答。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-22 00:24:07

我们有

代码语言:javascript
复制
(mymap uf lis) = (reduce f id lis) = 
 = (if (null? lis) id
     (f (car lis) (reduce f id (cdr lis))))

必须等于

代码语言:javascript
复制
 = (if null? lis) '()
     (cons (uf (car lis)) (mymap uf (cdr lis))))

匹配相应的实体,我们得到

代码语言:javascript
复制
id == '()

而且,从(mymap uf lis) = (reduce f id lis)开始,它也是(mymap uf (cdr lis)) = (reduce f id (cdr lis)),所以我们有

代码语言:javascript
复制
(f x y) = (cons (uf x) y)

因此,我们定义

代码语言:javascript
复制
(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) consr上。

现在,通过编写实际代码来完成定义应该没有问题,而不是点....

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33270902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档