在这种情况下如何在 Racket 上订购我的累积变量?

2023-12-12

出于教育原因,我使用 Racket 进行编码。

我收到了一项任务,其中我应该创建一个函数,在没有过滤器的情况下,它将接收一个列表作为输入,并仅返回另一个列表,其中包含第一个列表的偶数。

我提出了迭代过程的递归定义:

(define (add-even lista)
  (define (iter lista accu)
    (cond ((null? lista) accu)
          ((even? (car lista)) (iter (cdr lista)
                                     (cons (car lista) accu)))
          (else (iter (cdr lista) accu))))
  (iter lista empty))

效果很好。但是,我以相反的顺序得到结果,例如:

(add-even '(1 2 3 4 5 6 7))
>> '(6 4 2)

我应该怎么做才能使输出在输入上的出现顺序相同?

我知道如何使用反向函数来做到这一点。但这不是一个非常有效的方法..


当然,你可以在不使用的情况下做到这一点iter程序 ...

(define (add-even lista)
  (cond ((null? lista) empty)
        ((even? (car lista)) (cons (car lista) (add-even (cdr lista))))
        (else (add-even (cdr lista)))))

(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)

但我假设你用它来保持你的add-even过程尾递归。如果是这样的话……


Your accu可以是一个程序(而不是列表)它填补了你的“洞”cons链。而不是返回accu在计算结束时,您填写最后一个值,在本例中为empty并初始化identity反而。

I used bolding显示我更改的代码部分

(define (add-even lista)
  (define (iter lista accu)
    (cond ((null? lista) (accu empty))
          ((even? (car lista)) (iter (cdr lista)
                                     (λ (rest) (accu (cons (car lista) rest)))))
          (else (iter (cdr lista) accu))))
  (iter lista identity))

(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)

所以现在你得到尾递归并按正向顺序构建列表。我鼓励您逐步进行评估,看看它是如何工作的。这是连续传球风格.


如果你稍微重命名一下变量,也许这个过程会更好

(define (add-even lista)
  (define (iter l k)
    (cond ((null? l) (k empty))
          ((even? (car l)) (iter (cdr l)
                                 (λ (rest) (k (cons (car l) rest)))))
          (else (iter (cdr l) k))))
  (iter lista identity))

(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)

如果您使用的话,它会清理得更多一些named-let

(define (add-even lista)
  (let iter [(l lista) (k identity)]
    (cond ((null? l) (k empty))
          ((even? (car l)) (iter (cdr l)
                                 (λ (rest) (k (cons (car l) rest)))))
          (else (iter (cdr l) k)))))

(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)

...它甚至能清理干净more如果我们使用compose and curry

(define (add-even lista)
  (let iter [(l lista) (k identity)]
    (cond ((null? l) (k empty))
          ((even? (car l)) (iter (cdr l) (compose k (curry cons (car l)))))
          (else (iter (cdr l) k)))))

(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在这种情况下如何在 Racket 上订购我的累积变量? 的相关文章

  • 在 Slime 中复制/猛拉整个 Lisp 表单

    有没有办法在 Slime Emacs 中复制 猛拉整个表单 例如 如果我有以下功能 myfunc lst myotherfunc lst 我想复制 复制 myotherfunc lst 当我的光标位于该表单的左括号或右括号时 在 Slime
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 如何使用 FS2 中的分类器函数对对象进行分组?

    我有一个无序的流measurements 我想将其分组为固定大小的批次 以便以后可以有效地保留它们 val measurements for id lt Seq foo bar baz value lt 1 to 5 yield id va
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel
  • Clojure 中的快速素数生成

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • 使用Lisp或Scheme进行Java程序的运行时配置

    我现在看到几个项目在实际配置取决于仅在运行时可用的东西时结束 配置 Java 程序的典型方法是根据某些应用程序特定规则读取一个或多个属性文件 然后根据它们的值采取操作 在某一时刻 这种情况会崩溃 您需要在配置中使用实际的程序逻辑 然后可以用
  • 检查对象是否是字符串列表的列表?

    是什么elegant检查对象是否是字符串列表列表的方法 没有嵌套循环 也许这里必须是构造结构化迭代的常规方法 UPD 像这样的东西 l a b c d 1 3 e 2 f def recurse iterable levels result
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • Scheme 和 Common Lisp 之间的实际区别是什么? (或任何其他两种 Lisp 方言)

    注意 我并不是在问学哪个 哪个更好或者诸如此类的问题 我选择了 SICP 的免费版本 因为我觉得它读起来很好 我听说过有关它的好东西 并且我对编程的这一方面很感兴趣 我知道Scheme 是Lisp 的一种方言 我想知道 Scheme 和Co
  • 如何将函数转换为点自由形式?

    假设我有一个 JavaScript 函数 function f x return a b x c x 我如何将其转换为无点函数 通过组合函数 还有关于这方面的更多信息的资源吗 一般来说 当您将函数转变为无点风格时 没有简单的规则可遵循 要么
  • Racket 与Scheme 有何不同?

    Racket 是Scheme 的后代 Racket 与 R6RS 有何不同 它添加了什么 删除了什么 或者只是有所不同 我知道 Racket 不仅仅是一种语言 它还是一个语言平台 但我指的是主要的 Racket 方言 Racket 最终基于
  • Either 相当于受检查的异常吗?

    从 Scala 开始并阅读有关Either我很自然地将新概念与我所知道的东西 在本例中来自 Java 进行比较 与之前有什么区别吗concept检查异常和Either 在这两种情况下 失败的可能性在方法中明确注释 throws或返回Eith
  • 如何在 Objective-C 中编写 lambda 方法?

    如何在 Objective C 中编写 lambda 方法 Objective C 中 lambda 的概念现在封装为Blocks http developer apple com mac library documentation Coc
  • 向 DrRacket 添加“Simple Scheme”语言

    我想读完这本书 http www eecs berkeley edu bh ss toc2 html http www eecs berkeley edu bh ss toc2 html 但我无法让 简单方案 语言正常工作 该代码将无法运行
  • 如何在不进行尾调用优化的情况下用函数式编程替代方案替换 while 循环?

    我正在 JavaScript 中尝试一种更实用的风格 因此 我用诸如map和reduce之类的实用函数替换了for循环 然而 我还没有找到 while 循环的功能替代品 因为尾部调用优化通常不适用于 JavaScript 据我了解 ES6
  • 计算二项式时“应用程序:不是过程”

    我正在定义一个函数binomial n k 又名帕斯卡三角形 但出现错误 application not a procedure expected a procedure that can be applied to arguments g
  • Lisp 函数如何记住这段代码中的状态?

    我从网站上看到一段代码http www ccs neu edu home shivers newstyle html http www ccs neu edu home shivers newstyle html gt defun elem
  • Scala 解析器组合器的运算符优先级

    我正在研究需要考虑运算符优先级的解析逻辑 我的需求并不太复杂 首先 我需要乘法和除法比加法和减法具有更高的优先级 例如 1 2 3 应视为 1 2 3 这是一个简单的例子 但你明白了 我需要将更多自定义标记添加到优先级逻辑中 我可以根据此处

随机推荐

  • 是否使用了 static constexpr 变量 odr?

    给出下面的代码是Foo FOO1是否使用 ODR include
  • 使用 Algolia React-instantsearch 和 React-Native

    我正在尝试获取新的 Algolia反应即时搜索使用react native的组件 我一直在关注guide我完全被困住了 基本上 每当我尝试添加我的
  • 可以查看源代码或反编译 XLL Excel 添加

    是否可以在没有原始源代码的情况下查看 XLL Excel 插件的源代码 我猜测这个 XLL 是用 C 编写的 但不确定 IE 可以使用 dotPeek 反编译的 NET DLL 或者可以通过 Developer gt Visual Basi
  • 从 Access 表单调用 SQL Server 函数

    我正在寻找在 Access 前端使用 SQL Server 函数的正确方法 使用它的一种方式相当简单 只需调用函数 使用括号即可 准备就绪 但我一直坚持另一个案子 如果有两个独立的函数 第一个函数用于 编码 第二个函数用于 解码 数据 那会
  • 无法关闭应用程序浏览器窗口

    我可以打开我的窗口 并在其中执行很多操作 例如通过 Linkedin 或 Facebook 登录 但我无法关闭它以返回我的应用程序 1 我尝试捕获事件来跟踪 url 并在 url 包含特定关键字时关闭窗口 但该事件从未被触发 我从来没有任何
  • 使用 Python 的 MSN

    我计划为我运行的游戏创建一个简单的机器人 并将其放在 MSN 上并回答查询 我想使用Python来做到这一点 并用谷歌搜索并发现MSNP 我想 太棒了 和 太棒了 但它似乎已经有 5 年了 奇怪的是 它无法连接到 MSN 因为这些年来他们可
  • Netbeans IDE 中的自动格式化 Javascript

    是否有任何已知的插件或方法可以在 Netbeans IDE 中正确自动格式化 Javascript 编辑 2012 年 9 月 15 日 进一步研究后 我发现 javascript 模块已经被重写 非常需要 您终于可以找到 javascri
  • 不使用存储库模式,按原样使用 ORM (EF)

    我总是使用存储库模式 但对于我最新的项目 我想看看是否可以完善它的使用以及 工作单元 的实现 我开始挖掘得越多 我开始问自己这个问题 我真的需要它吗 现在这一切都始于 Stackoverflow 上的几条评论 可以追溯到 Ayende Ra
  • Rails:使用控制器渲染 js.erb 模板

    我有一个 Rails 应用程序试图合并一些 AJAX 其中单击 新建 会打开一个模式窗口和一个表单 我希望能够在失败时显示验证错误 因此在我的创建操作中 我考虑重新渲染 new js erb 文件 这是正确的方法吗 def create p
  • Android 谷歌标签管理器

    我正在按照我的营销团队的要求为 Android 应用程序 V4 实施 Google 跟踪代码管理器以供将来使用 而且我从未在网站的 GTM 上工作过 所以在这种情况下我很天真 我已经根据官方网站上的说明创建了帐户 容器和标签 我已将标签管理
  • 填充八位字节字符串

    我有 65 个不同位长度的参数 我需要将它们填充为八位字节字符串 参数将连续填充在八位字节字符串中 例如 假设第一个参数是 1 位长 因此它将填充在八位位组字符串的第 1 个八位位组的第 0 位位置 现在第二个参数假设为 9 位长 因此 该
  • 子类中的重载运算符

    游览和导游 导游扩展了旅游类别 我在旅游类中超载了 gt 运算符 我的旅游课程看起来像 include
  • cakephp中的save和saveAll函数有什么区别?

    任何人都可以举个例子吗 save用于简单地保存模型 Array ModelName gt Array fieldname1 gt value fieldname2 gt value 假设上述信息存储在名为 data 的数组中 则可以调用 t
  • WCF REST 文件上传

    我正在开发一个 WCF Web 服务 它需要能够上传文件等 目前我添加 平面图 项目的方法如下所示 OperationContract WebInvoke Method GET ResponseFormat WebMessageFormat
  • 如何生成相关的 Uniform[0,1] 变量

    这个问题与如何生成具有不同分布的相关变量的数据集 在 Stata 中 假设我创建一个遵循 Uniform 0 1 分布的随机变量 set seed 100 gen random1 runiform 我现在想要创建第二个随机变量 它与第一个随
  • JAXB 错误:有多个映射。由于两个对象工厂具有相同的 Bean

    我有两个 Maven JAXB 项目 A 主要 Maven JAXB 存根 XSD 项目 其中包含 BASKET xsd B Maven JAXB 存根想要将 BASKET xsd 包装在自己的对象中的用户项目 这会产生两个对象工厂 不同的
  • 如何在 GitHub 上合并远程更改?

    第一次尝试 Github 推送时出现以下错误 rejected master gt master non fast forward error failed to push some refs to email protected me m
  • masm32 调用 stdout 没有输出

    我正在使用 masm32 在 Windows 7 上编译和链接 它与下面的代码一起工作得很好 然而 调用 stdOut 并不是简单地在命令提示符上打印任何内容 我究竟做错了什么 386 model flat stdcall option c
  • 如何制作一个互动节目?

    我正在学习 Ocaml 我需要创建一个可以通过以下方式与用户交互的程序 Program Welcome User command1 arg1 arg2 program The answer is User command2 arg prog
  • 在这种情况下如何在 Racket 上订购我的累积变量?

    出于教育原因 我使用 Racket 进行编码 我收到了一项任务 其中我应该创建一个函数 在没有过滤器的情况下 它将接收一个列表作为输入 并仅返回另一个列表 其中包含第一个列表的偶数 我提出了迭代过程的递归定义 define add even