展开方案中的函数

2024-04-07

Goal:实施unfold仅使用两个参数的函数。

论据:

  • 第一个参数是 f,它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对(这两个元素中的第一个是某种类型 A 的列表中的下一个元素,下一个初始值又是某些类型 I)。
  • 第二个参数是某种类型 I 的初始值,返回的是类型 A 的项目列表。

这是我到目前为止所拥有的,我不确定为什么它不起作用:

(define (descending i)
  (if (= i 0)
    (list)
    (cons i (- i 1))))

(define nil (list))

(define (unfold f init)
  (if (eq? (f init) '())
    (list)
    (cons init (unfold f (f init)))))

(unfold (descending 5))

应该评估为

'(5 4 3 2 1)

这应该是结果,但不是。我究竟做错了什么?


首先,应该是(unfold descending 5). Then f会产生一对,你会使用它的两个组成部分,

(define (unfold f init)
  (if (eq? (f init) '())
      (list)
      (cons (car (f init)) (unfold f (cdr (f init))))))

但这具有可怕的计算复杂性,因为它称为(f init)每次迭代三次。一个谦虚的let https://docs.racket-lang.org/reference/let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29绑定可以解决这个问题。

(define (unfold f init)
  (let ((r (f init)))
    (if (empty? r) ;; instead of (eq? r '())
        (list)
        (cons (car r) (unfold f (cdr r))))))

和尾递归形式使用named let https://docs.racket-lang.org/guide/let.html#%28part._.Named_let%29

(define (unfold f init)
  (let loop ((acc empty)
             (state (f init)))
    (if (empty? state)
        (reverse acc)
        (loop (cons (car state) acc)
              (f (cdr state))))))

并使用match https://docs.racket-lang.org/reference/match.html.

(define (unfold f init)
  (let loop ((acc empty)
             (state (f init)))
    (match state
      ((cons x next)
       (loop (cons x acc)
             (f next)))
      (empty
       (reverse acc)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

展开方案中的函数 的相关文章

  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 如何让球拍不打印?

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

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 如何使用Emacs运行方案?

    我跟着这个tutorial http jeffcjensen net scheme 并成功安装了Emacs STk Quack 问题是我怎样才能像在 Racket 中那样加载我的程序 在 Racket 中 我可以在上方窗口中编辑代码 输入一
  • 为什么《小阴谋家》中的所有 lambda 表达式都是如此?

    在从 SICP 学习了一些计划之后 我开始阅读 小计划 我觉得这本书很有趣 并且已经完成了大约四分之一 我注意到我可以在不使用 lambda 的情况下编写许多 大多数 全部 解决方案 而 The Little Scheduleralways
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • 方案中的配对组合

    我试图找到可以使用方案中的 N 对列表进行的各种组合 这是我到目前为止所处的位置 define pair combinations list of pairs if null list of pairs nil let first caar
  • Clojure 中的快速素数生成

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • Scheme 和 Common Lisp 之间的实际区别是什么? (或任何其他两种 Lisp 方言)

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

    Racket 是Scheme 的后代 Racket 与 R6RS 有何不同 它添加了什么 删除了什么 或者只是有所不同 我知道 Racket 不仅仅是一种语言 它还是一个语言平台 但我指的是主要的 Racket 方言 Racket 最终基于
  • defvar、defparameter、setf 和 setq 之间有什么区别

    我找到了一个类似问题 https stackoverflow com questions 3855862 setq and defvar in lisp 但我不太明白这个解释 所以我尝试使用以下示例运行 clisp 1 gt defvar
  • 如何向现有 (OS X) 可执行文件添加节?

    有什么方法可以将部分添加到已链接的可执行文件中吗 我正在尝试基于以下代码对 OS X 可执行文件进行代码签名苹果说明 http developer apple com library mac documentation Security C
  • 用于嵌套表达式的方案宏

    可以在Scheme中编写宏吗 用define syntax 例如 将采用如下表达式 op a b c d e f g h i j 并将像这样的yield表达式作为输出 op op op op op op op op op a b c d e
  • 向 DrRacket 添加“Simple Scheme”语言

    我想读完这本书 http www eecs berkeley edu bh ss toc2 html http www eecs berkeley edu bh ss toc2 html 但我无法让 简单方案 语言正常工作 该代码将无法运行

随机推荐

  • Xcode 6 Storyboard Unwind Segue 与 Swift 未连接退出

    当尝试将导航栏按钮连接到 Xcode 6 中 ViewController 的退出项时 不太确定这是否是 Xcode 6 问题 但值得一提 因为它处于测试阶段 它在自定义类中找不到 Swift 函数 它应该找到的函数 IBAction fu
  • 处理过期的VOIP推送

    所以我有 VOIP 呼叫应用程序 一切正常 一个用户可以呼叫其他用户并且可以通话 但我面临的问题是我不明白如何解决这个问题 问题 当user1呼叫user2时 user1向user2发送voip推送请求 但是当收到推送通知时 user2 处
  • Firebase 托管未验证 GoDaddy 中的 TXT 记录

    我部署了我的应用程序 现在我正在尝试添加我的自定义 URL 我按照 Firebase 的说明将他们的 TXT 记录添加到我的 DNS GoDaddy 中 但现在 Firebase 表示尚未得到验证 我认为我做错了什么 但这里没有什么可搞乱的
  • QVBoxLayout:如何使用 Qt 设计器将小部件对齐到顶部

    我仅将 qt 设计器用于 ui 布局 这与这个问题几乎是同一个问题 QVBoxLayout 如何将小部件垂直对齐到顶部而不是中心 https stackoverflow com questions 10082299 qvboxlayout
  • Php:查找 Chrome 和 Safari 浏览器

    我使用下面的代码来查找用户代理 user agent SERVER HTTP USER AGENT if preg match MSIE i user agent echo Internet Explorer if preg match F
  • 安装分析后,我的 Worklight 6.2 控制台上没有运行时

    我刚刚安装了Worklight 6 2服务器 使用配置工具部署了一个简单的项目 并且运行正常 然后我按照知识中心的说明安装分析 之后 当我在浏览器中打开 WL 控制台时 我收到 找不到运行时 分析似乎运行良好 我的 war 文件位于 Lib
  • 如何在teamcity中运行e2e测试,如何在后台运行服务器并运行e2e

    如何在 teamcity 构建步骤中运行我需要的服务器以及 e2e 测试 我对我的 Angular 2 应用程序进行了 Protractor e2e 测试 我有一个有趣的 Angular cli 和 gulp 组合 但请耐心等待 这是我在本
  • 使用 SUBSTR Oracle SQL 将 SPACE 添加到 CONCAT

    我试图将两列连接在一起 并用空格分隔 第一列需要 SUBSTR 另一列则不需要 我写了这个查询 SELECT CONCAT SUBSTR FIRST NAME 1 1 LAST NAME AS NAME FROM OEHR EMPLOYEE
  • 在caffe prototxt 文件中。 TRAIN 和 TEST 阶段做什么?

    我是咖啡新手 感谢你们 in https github com BVLC caffe blob master src caffe proto caffe proto https github com BVLC caffe blob mast
  • 为什么在 PHP 中使用 FPDF 时亚洲 unicode 字符没有出现在 PDF 上?

    我在用FPDF http www fpdf org 创建 PDF 并tFPDF http www fpdf org en script script92 php允许使用 unicode 字符 例如中文 日文或韩文 我正在使用 tFPDF 示
  • 如何测试角度事件?

    我需要测试事件是否正确发出或广播 并手动触发事件 最好的方法是什么 如果您只需要对事件触发和捕获进行一些测试 我就是这样做的 为了确保某个事件被触发 emit ed or broadcast ed 间谍是正确的选择 您需要对将调用的范围的引
  • ICommand MVVM 实现

    因此 在我正在执行的这个特定 MVVM 实现中 我需要几个命令 我真的厌倦了逐个实现 ICommand 类 因此我想出了一个解决方案 但我不知道它有多好 因此我们将非常感谢这里任何 WPF 专家的意见 如果您能提供更好的解决方案 那就更好了
  • 电子预警系统。如何在没有初始同步的情况下获取最新的SyncState?

    假设我的文件夹中有 100 000 条消息 我希望能够与最新更改同步 但我不需要任何旧消息 请求初始同步 SyncFolderItems null syncState 会带回所有 100 000 条消息 我不需要 如何在不从服务器读取 10
  • 如何获取一个月中的工作日列表?

    在另一个问题中 https stackoverflow com questions 3849975 how to get all dates in a given month in c它展示了如何获取一个月中的所有天数 我需要同样的东西 但
  • JMS 有哪些替代方案? [关闭]

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

    我有两个线程 其中一个写入 PipedOutputStream 另一个从相应的 PipedInputStream 读取 背景是一个线程正在从远程服务器下载一些数据 并通过管道流将其复用到多个其他线程 问题是有时 尤其是下载大文件时 gt 5
  • 路由应用程序覆盖文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我最近将我的游戏提交到了 App Store 它最近已获得批准 正在 App Store 处理 当我单击我的应用程序时 它显示 路由应用程序覆盖文件
  • GWT-出口商。工作示例

    我有一个 Java 库 我需要将其转换为 JS 我找到了解决方案GWT 创建实用的 javascript 库 https stackoverflow com questions 3125556 gwt to create utility j
  • 打开第二个 fancybox 在另一个 fancybox 中!

    嘿 我的花式盒子遇到了麻烦 我正在一个 fancybox 中启动一个表单 一般是通过fancybox以iframe方式打开 因为它是作为其他域的小部件启动的 在此 iframe 中 我打开第二个 fancybox 来显示验证错误 所有这一切
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参