在这种情况下如何在 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 上订购我的累积变量? 的相关文章

  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • 方案字符串追加?递归复制字符串

    设计一个名为 string dup 的程序 它使用一个字符串 s 和一个数字 n 并返回一个由 s n 次连接而成的字符串 每个 s 实例之间有空格 即 string dup a 3 gt a a a 不使用复制 但我想我们可以使用字符串追
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • Vim 脚本中的“reduce”函数

    Vim 脚本有一些非常基本的函数式编程工具 It has map and filter 但据我所知它缺乏reduce 功能 Reduce https en wikipedia org wiki Fold 28higher order fun
  • 如何让球拍不打印?

    我正在 Racket 中编写一个程序 我正在使用它运行racket foo rkt 这是可行的 除了程序顶层每个表达式的结果都会被打印 即使没有调用打印函数 就好像程序是逐行输入到 REPL 中的 但在这种情况下 我根本不尝试使用 REPL
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • std::bind 重载解析

    下面的代码工作正常 include
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 如何在 emacs 中自动回答是或否

    I binded function semantic symref to key C c C r like this global set key kbd C c C r semantic symref everytime I presse
  • 卷积函数可以写成尾递归形式吗?

    我有一个函数 我想以尾递归形式编写 该函数计算求和的方法数k通过滚动s双面模具n次 我已经在上面看到了这个函数的数学解这个答案 https math stackexchange com questions 397689 why convol
  • SBCL初始化文件

    我想知道应该在哪里保存 sbclrc 文件 我尝试将其保存在我的 sbcl 文件夹中 但它似乎不起作用 我使用的是 Windows XP 和 Emacs 版本 23 我正在尝试设置 asdf install 这就是为什么我要修改初始化文件
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • 我为什么要学习 Lisp? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 是否使用了 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