使用foldl 和foldr 反转Scheme 中的列表

2023-12-04

如何定义一个函数来反转Scheme中的列表,方法是使用foldr and foldl?

我们想要的是一个简洁的解决方案,使用foldl调用并使用不同的解决方案foldr调用,定义为:

(define (foldl operation lst initial)
    (if (null? lst) initial
        (foldl operation 
               (cdr lst) 
               (operation (car lst) initial))))

and

(define (foldr operation lst initial)
    (if (null? lst) initial
        (operation 
            (car lst) 
            (foldr operation (cdr lst) initial))))

聪明的人会观察到foldl实现是尾递归的,因为返回值是在调用每个递归步骤时计算的 - 在最后一步,整个答案已经计算出来并简单地返回到链上。

The foldr实现不是尾递归的,因为它必须使用递归链上传递回的值来构建返回值。

因此,我们感兴趣的两个Scheme实现应该采用以下形式,

(define (rev1 lst)
    (foldl ___________________________

**Solution:**
(define (rev1 lst)
    (foldl cons lst '()))

and

(define (rev2 lst)
    (foldr ___________________________

**Solution 1:**
(define (rev2 lst)
    (foldr 
       (lambda (element accumulator) 
               (foldr cons accumulator (cons element '())))
       lst '())) 

**Solution 2:**
(define (rev2 lst)
    (foldr 
       (lambda (element accumulator) 
               (append accumulator (cons element '())))
       lst '())) 

最终目标是能够调用以下内容,

(rev1 '(1 2 3)) -> (3 2 1)
(rev2 '(1 2 3)) -> (3 2 1)

The foldl解决方案应该相对简单(基于我们的直觉),但是foldr解决方案可能需要更多的思考。

之前与此问题类似(但记录较少)的问题最终没有得到解答和/或关闭。


这看起来像是家庭作业,所以我会给你一些提示来帮助你开始。这foldlcase 很简单,你只需要找到要传递的正确函数,并记住:foldl可以可视化为向后处理列表(最后一个元素在前,第一个元素在最后),因此您所要做的就是将列表中的当前元素与累积值粘在一起:

(define (rev1 lst)
  (foldl <???> lst '()))

The foldr情况只是稍微困难一点,只要记住这一点foldr按照输入列表中出现的顺序处理列表中的元素。同样,您必须找到正确的调用过程:

(define (rev2 lst)
  (foldr (lambda (e a)
           <???>)
         lst
         '()))

你需要以某种方式放置e(当前元素)位于end of a,累计值。提示:你会发现append and list在这里很有用。

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

使用foldl 和foldr 反转Scheme 中的列表 的相关文章

  • 使用 sapply 的列表和矩阵

    我有一个也许是基本的问题 我在网上搜索过 我在读取文件时遇到问题 尽管如此 我还是按照 Konrad的建议设法读取了我的文件 我很欣赏这一点 How to get R to read in files from multiple subdi
  • 将不同类型的对象与可比较的对象进行比较

    A java public class A implements Comparable private String id private String name public A String a String b id a name b
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 如何在 C# 中使用窗口窗体创建动态下拉列表

    我正在尝试为朋友的手机商店构建一个简单的库存程序 我想使用C 并访问数据库来存储数据 DB 将有 2 个主要列表 devices 品牌 型号 颜色 价格 库存 最小库存 parts 品牌 型号 描述 库存 最小库存 GUI 将使用多个下拉列
  • 在python中组合2个列表

    我有 2 个列表 每个列表大小相同 并且有兴趣将这两个列表组合起来并将其写入文件中 alist 1 2 3 5 blist 2 3 4 5 结果列表应该是这样的 1 2 2 3 3 4 5 5 之后我希望将其写入文件 我怎样才能做到这一点
  • 如何从Python列表中的字符串中删除双引号?

    我正在尝试在字典列表中获取一些数据 数据来自 csv 文件 因此都是字符串 文件中的键都有双引号 但由于这些都是字符串 我想删除它们 这样它们在字典中看起来像这样 key value 而不是这个 key value 我尝试简单地使用 str
  • Django查询:如何过滤对象以排除列表中的id?

    如何在查询中进行过滤 以便结果排除 ID 属于列表的任何对象实例 可以说我有 object id list 1 5 345 MyObject objects filter Q time gte datetime now Q what to
  • 在Racket中将结构递归转化为累积递归

    我有一些代码来查找最大高度并将其替换为关联的名称 身高和姓名有单独的列表 每个列表的长度相同且非空 我可以使用结构递归来解决这个问题 但必须将其更改为累积递归 而且我不确定如何做到这一点 我见过的所有例子都让我困惑 有人能够将代码变成使用累
  • 按多个键分组并对字典列表的值进行汇总/平均值

    在Python中按多个键进行分组并对字典列表进行汇总 平均值的最Pythonic方法是什么 假设我有一个字典列表 如下所示 input dept 001 sku foo transId uniqueId1 qty 100 dept 001
  • Backbone Marionette CompositeView 排序列表 - 在添加时呈现额外的模型

    这是小提琴 http jsfiddle net QhQ8D 10 http jsfiddle net QhQ8D 10 代码在下面 制作一个聊天应用程序 需要一个排序的 连接的用户列表 名称上带有比较器的图形集合连接到 CompositeV
  • 查找列表中项目的索引

    给定一个列表 foo bar baz 和列表中的一个项目 bar 如何获取它的索引1 gt gt gt foo bar baz index bar 1 See 文档 https docs python org tutorial datast
  • 迭代函数可以调用自身吗?

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

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • 两个布尔列表之间的逻辑运算

    我得到了一个奇怪的结果 我尝试应用and or the orpython 中 2 个布尔列表的运算符 事实上 我得到的结果与我的预期完全相反 True False False and True True False gt True True
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • 如果两点之间的距离低于某个阈值,则从列表中删除点

    我有一个点列表 只有当它们之间的距离大于某个阈值时 我才想保留列表中的点 因此 从第一个点开始 如果第一个点和第二个点之间的距离小于阈值 那么我将删除第二个点 然后计算第一个点和第三个点之间的距离 如果该距离小于阈值 则比较第一点和第四点
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li

随机推荐

  • Pandas:如何通过以下方式连接数据帧?

    我想将多个数据帧连接成一个数据帧 我希望发生串联的方式如以下示例所示 Input tables A B C D 0 x p 2 4 1 y q 3 5 A B E F 0 x p 6 8 1 y q 9 10 Output table A
  • 如何将文本对象添加到现有的pdf中

    我有一个源 pdf 我正在通过添加文本对象来修改它 我正在使用 PDF 规范中提到的 增量更新 但是 在使用此方法添加文本对象时 我犯了一些错误 导致 pdf 在 Adob e Reader 11 中无法正确呈现 当打开 pdf 并双击它时
  • 将扫描仪类与 GUI 一起使用

    我使用 java swing 创建 GUI 并使用扫描仪类获取从 JTextFields 输入到服务器的信息 这可能吗 如果可能的话怎么办 不 没有控制台 因此不要使用 Scanner 相反 您可以使用 TextField 的 getTex
  • 如何使用 BeginInvoke 从 BackgroundWorker 更新 RichTextBox

    我有一个小应用程序 它读取管道分隔文件并将行写入 RTB 突出显示某些 列 中是否存在不允许的字符 这工作得很好 但是 用户想要一个进度条 并看到 实时 写入的行 并且能够中途取消 我有以下扩展方法 我一直用它来写入 RichTextBox
  • Neo4jClient Cypher 查询的排序顺序不正确

    我有以下 Neo4jClient 代码 var queryItem graphClient Cypher Start new n Node ByIndexLookup myindex Name sku Match p n r Relatio
  • 当 SSRS 中的数据不存在时填充“0”

    我正在尝试在 SSRS 中创建一个报告 其中有一个矩阵 其中性别作为列标题 专门定义的年龄组作为行 该报告按日期排序 即 显示的记录按 modifedAt 值过滤 我的问题是 我希望显示所有年龄组类别 即使数据集不返回该行的任何数据 因此
  • 有没有一个网站可以让我查看不同浏览器支持哪些 HTML 5 标签?还有WebGL?

    我想制作一个 HTML Javascript 网络应用程序 有没有一个网站可以比较哪些浏览器已经支持 HTML5 标签 还有WebGL 是的 有很多 以下是每个人的几个 HTML http a deveria com caniuse HTM
  • 如何查询到Firestore子文档

    我正在开发一个应用程序 我想查询 Firestore 子文档 让我进一步解释一下 我有一组存储汽车的文档 每个文档都有一辆带有描述的特定汽车 在上面的每个文档中 我都有一个名为的子集合user data它有自己的文档 其中存储了将汽车添加到
  • C#.NET 线程问题

    我面临 C NET 应用程序中线程之间通信的问题 希望有人能指导我找到可能的解决方案的正确方向 我有一个 C NET 中的应用程序 它是一个 Windows 窗体应用程序 我的应用程序有两个线程 一个线程是主线程 UI 线程 另一个线程是子
  • J表。删除行。消耗事件以不再进一步分派

    我需要按删除键从 JTable 中删除行 所以用例非常简单 用户选择一些行 按删除键 行就会被删除 代码也很简单 DefaultTableModel tableModel DefaultTableModel table getModel i
  • 库“dart:isolate”中是否有 dart 的 `spawnUri(...)` 示例?

    有一个spawnUri uri 函数于dart isolate 但我没有找到任何例子 我猜到了它的用法 但失败了 假设有2个文件 在第一个文件中 它会调用spawnUri对于第二个 并与之沟通 首先 dart import dart iso
  • 验证 JTextField 值,使其以“RA”开头,然后有 8 位数字

    我有一个JTextField用户必须在其中输入数据 它的价值必须始终从RA并且后面必须正好有 8 位数字 因此 它的长度始终为 10 例如 RA12345678 我如何在 Java 中执行此操作 我尝试使用MaskFormatter and
  • 如何检测哪个 EKevent 被更改

    我遇到问题了 我需要知道 EventStore 中的事件何时发生更改 因此对于本例我使用EKEventStoreChangedNotification但这个通知给我带来了难以理解的字典userInfo它看起来像这样 EKEventStore
  • python加密模块中的错误:_RSAPrivateKey'对象没有属性'sign

    在我的 Python 代码中 我使用密码学模块 我的磁盘上有一个私钥 所以 根据文档 我使用了这个例子加载该密钥 然后使用该密钥对消息进行签名 但运行程序会抛出 AttributeError RSAPrivateKey 对象没有属性 sig
  • 学习正则表达式 (PHP) 的最佳地点是哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 学习正则表达式 PHP 的
  • 备份/恢复整个 Eclipse 工作区

    我开始学习Android操作系统 我还处于学习模式 在学习 Android 的同时 我似乎对 Java 有了一些了解 因为我发现的大多数示例都希望您使用 Eclipse 好吧 我想我也在学习 Eclipse 这是一件好事 我不是在抱怨 这个
  • Xamarin.Forms。 SwipeGesture 和 ScrollView 在 Android 上不能一起使用

    我将 Grid 与 SwipeGesture 和 ScrollView 一起使用 ScrollView 运行良好 但 SwipeGesture 不适用于 Android 在 iOS 中我没有问题 为什么 请帮帮我
  • UIDatePicker 语言环境什么都不做?

    我正在以编程方式创建 UIDatePicker 并使用以下代码设置其区域设置 datePicker locale NSLocale alloc initWithLocaleIdentifier es ES autorelease 日期选择器
  • 在 iOS 设备上查找正确的时间

    我想找出 iOS 设备上的正确时间 即使用户手动设置了错误的时间 在设置 gt 常规 gt 日期和时间中 有自动设置选项 如果用户取消选中该选项 那么我如何以编程方式找到正确的时间 使用 NTP 协议获取当前时间或从服务器提供时间并在应用程
  • 使用foldl 和foldr 反转Scheme 中的列表

    如何定义一个函数来反转Scheme中的列表 方法是使用foldr and foldl 我们想要的是一个简洁的解决方案 使用foldl调用并使用不同的解决方案foldr调用 定义为 define foldl operation lst ini