高阶函数和 Set 如何在 Scheme 上工作?

编码器

Scheme中的这两个问题你是怎么做的???

  1. 编写一个高阶函数两次,该函数将一个参数的函数作为参数,并返回一个函数,该函数表示该函数对其参数的应用两次。给定平方函数的通常定义,什么函数是 (twice (twice square))?
usage: (twice square)
=> #<procedure>
usage: ((twice square) 2)
=> 16
usage: ((twice (twice square)) 10)
=> 10000000000000000
  1. 假设您要使用列表数据结构来实现 Set 数据类型。编写插入和成员操作。(您可能需要重命名函数以避免命名冲突。)
usage: (member 4 (list 1 2 4))  
=> #t
usage: (insert 4 (list 1 2))
=> (4 1 2)

我已经为问题 2 尝试了下面的代码(但它没有按照我想要的方式工作),而且 hHow 不知道问题 1

(define (set? lst)      
  (cond ((null? lst) #t)
        ((member? (car lst) (cdr lst)) #f)
        (else (set? (cdr lst)))))
马丁·普泽达
  1. 高阶函数是将函数作为参数(或返回函数作为结果)的函数。您可以按照与普通函数相同的方式定义它们,使用define. 例如,map将过程(在 Racket 中,函数称为过程)作为第一个参数,并在列表的每个元素上调用该过程:
> (map add1 '(1 2 3 4 5))
'(2 3 4 5 6)
> (map sub1 '(1 2 3 4 5))
'(0 1 2 3 4)

想象一下,您希望使用 将每个数字增加 2 map您可以为此定义命名函数:

(define (add2 x) (+ x 2))

> (map add2 '(1 2 3 4 5))
'(3 4 5 6 7)

或使用lambda,它创建匿名函数:

> (map (lambda (x) (+ x 2))
       '(1 2 3 4 5))
'(3 4 5 6 7)

这个函数不能从你程序的其他地方调用(除非你把它绑定到某个符号上)并且在使用后被丢弃。

由创建的函数lambda也可以作为结果返回。也许你经常需要添加一些数字,你不想(lambda (x) ... )每次都写所以,你可以写这样的函数:

(define (adder y)
  (lambda (x) (+ x y)))

并将其用于map

> (map (adder 3) '(1 2 3 4 5))
'(4 5 6 7 8)
> (map (adder 4) '(1 2 3 4 5))
'(5 6 7 8 9)

请注意,创建的匿名函数会记住,即y = 3y = 4实际上,Racket 中的所有函数都是词法闭包,它们会记住它们的创建位置以及在那一刻绑定了哪些符号。

因此,您的解决方案将使用以下原则:

(define (square x)
  (* x x))

(define (twice f)
  (lambda (x) (f (f x))))

那么,((twice (twice square)) 10)可以改写为

> ((lambda (x) ((lambda (x) (square (square x)))
               ((lambda (x) (square (square x)))
               x))) 10)
10000000000000000

那是 10^16。

> (= ((twice (twice square)) 10)
     (expt 10 16))
#t
  1. 我不确定您是否需要编写除memberand之外的其他函数insert,因为在您的示例中,它们在列表中被调用并且没有list->set明确提到任何函数。

函数member必须重命名,如下所示:

(define (my-member v lst)
  (cond ((null? lst) #false)
        ((= v (car lst)) #true)
        (else (my-member v (cdr lst)))))

(内置函数member实际上返回列表,但这已经足够了。)

使用insert,您必须检查您的列表是否已经包含该元素,在这种情况下,按原样返回。

(define (insert v lst)
  (if (my-member v lst)
      lst
      (cons v lst)))

例子:

> (insert 3 '(1 2 3))
'(1 2 3)
> (insert 4 '(1 2))
'(4 1 2)

您可能还会发现check-duplicates并且remove-duplicates很有用,并且已经有用于处理集合的Racket 库

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

--set-mark选项如何在Netfilter(IPTABLES)上工作?

高阶函数如何在 Scala 中工作?

默认参数和@JvmOverloads如何在Kotlin上工作?

Kong 如何在 NGINX 和 OpenResty 上工作

如何使样条函数在嵌套列表上工作

reduce()高阶函数如何工作?

如何在OSX上工作?

高阶函数(例如.map())如何在JavaScript中内部工作?

如何让我的 Javascript 函数在部分 html 页面上工作?

如何 !!在bash上工作?

如何使用 pycharm IDE 在 pyspark 和 mongoDB 上工作

如何使Conda和Virtualenv在Mac OS Catalina上工作?

如何让ALT + B和ALT + L在终端上工作?

如何使Xdebug在Centos和Zend Studio上工作?

如何让CSS和Django在实时服务器上工作

汇总函数如何在核心数据中的一对多关系上工作

变更检测如何在Angular服务中声明的字符串,数组和对象上工作

如何在StickerView的撤消和重做功能上工作?

ping如何在没有setuid和功能的情况下在Fedora上工作?

模板推导和decltype(T)如何在参考上工作?

MIN()和MAX()如何在MySQL中的CHAR / VARCHAR字符串上工作?

如何在 SvelteKit 中初始化 ApolloClient 以同时在 SSR 和客户端上工作

Scheme中的模和余数应如何工作?

使用DDD和AutoMapper,如何在单个工作单元中的多个服务的同一聚合根上工作?

instanceof如何在接口上工作

typedef结构如何在语法上工作?

Teamviewer如何在端口80上工作?

initNumToRender如何在FlatList上工作?

造型如何在角组件上工作?