如何反转列表?

2024-01-19

在Scheme中反转列表的函数是什么?

它需要能够处理嵌套列表。所以如果你做类似的事情(reverse '(a (b c d) e))你会得到(e (b c d) a)作为输出。

我应该如何解决这个问题?我不仅仅是在寻找答案,而是寻找有助于我学习的东西。


(define (my-reverse ls)
  (define (my-reverse-2 ls acc)
    (if (null? ls)
      acc
      (my-reverse-2 (cdr ls) (cons (car ls) acc))))
  (my-reverse-2 ls '()))

这使用累加器变量来反转列表,从传入列表中取出第一个元素并将其放在累加器的前面。它隐藏了累加器获取函数,只公开了获取列表的函数,因此调用者不必传入空列表。这就是为什么我有 my-reverse-2。

(my-reverse-2 '(a (b c d) e) '()); will call
(my-reverse-2 '((b c d) e)  '(a)); which will call
(my-reverse-2 '(e)  '((b c d) a)); which will call
(my-reverse-2 '() '(e (b c d) a)); which will return
'(e (b c d) a)

因为最后一个函数调用my-reverse-2是一个电话my-reverse-2,并且返回值直接传递(第一次调用的返回值is第二次调用的返回值,依此类推)my-reverse-2 is 尾部优化,这意味着它不会耗尽堆栈上的空间。因此,只要您愿意,可以安全地使用列表来调用它。

如果您希望它应用于嵌套列表,请使用如下内容:

(define (deep-reverse ls)
  (define (deep-reverse-2 ls acc)
    (if (null? ls)
        acc
        (if (list? (car ls))
            (deep-reverse-2 (cdr ls) (cons (deep-reverse (car ls)) acc))
            (deep-reverse-2 (cdr ls) (cons (car ls) acc)))))
  (deep-reverse-2 ls '()))

在将元素添加到列表之前,它会检查该元素是否是列表,如果是,则首先将其反转。 由于它调用自身来反转内部列表,因此它可以处理任意嵌套。

(deep-reverse '(a (b c d) e)) -> '(e (d c b) a)尽管存在嵌套列表,但它是按字母顺序逆序排列的。 其评估如下:

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

如何反转列表? 的相关文章

  • 产量回报延迟迭代问题

    我知道yield return 利用了延迟加载 但我想知道我是否可能滥用迭代器或者很可能需要重构 我的递归迭代器方法返回给定的所有祖先PageNode包括pageNode itself public class PageNodeIterat
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 生成总和为 N 的所有数字排列

    我正在编写一个程序来创建所有数字 起初 我尝试使用分区函数对数字进行分区 然后对每个数字集进行排列 但是我认为这行不通 最好的方法是递归排列 同时对数字求和 这超出了我的能力范围 抱歉 如果这听起来真的很愚蠢 但我真的不知道 Example
  • 如何使用递归获取父级的所有子级,然后获取其子级

    问候 我的 JSP Web 应用程序中有父事务的比喻 我将事务 ID 存储在数据库中 要求是显示父级的所有子级 然后显示父级子级的后续子级 实际上 这个父母及其孩子的列表永远不会超过 4 或 5 层 但我需要考虑到它可以比这更多层 我尝试过
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • C++ 递归变量

    我想我的问题真的很简单 但我现在尝试解决它几个小时 但我似乎不明白 我有一个 ast 树 用 boost library 创建 并通过递归迭代它 我将所有节点保存在 NodeDescriptions 列表中 其中包含实际节点的编号 实际节点
  • “foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是什么意思?

    我遇到了以下代码片段 函数定义 choose x xs choosep x xs where choosep x x choosep x x choosep x xs choosep x xs in 柯里编程语言 http en wikip
  • 如何用模板参数包的内容填充数组?

    我嵌套了与 VS 2015 一起使用的部分专用模板代码 直到我发现它不符合标准 https stackoverflow com q 3052579 2747466 我希望如此 所以我扭曲了我的代码来克服前一个问题 并且that one ht
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 我在 C 的输出中收到未知字符

    我正在做这个练习 编写一个程序 反转句子中的单词 如下所示 我的名字是约翰 gt 约翰的名字是我的 我写了这个 include
  • Java中的递归排列生成错误结果

    问题是生成字典排列 起初 我的代码是这样的 public class Problem24 public static void main String args permutation 123 public static void perm
  • NodeJS 在目录中递归地哈希文件

    我能够实现目录中的递归文件遍历 即探索目录中的所有子目录和文件 为此我使用了answer https stackoverflow com questions 5827612 node js fs readdir recursive dire
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗?

    在研究 Emacs Lisp 的符号单元时 我发现像这样的示例函数 defun a rest x x 我可以打电话 symbol function a 返回 lambda rest x x 如果我愿意的话我可以使用它 gt lambda r
  • 如何用流程图表示递归函数?

    我需要在流程图上表示递归函数 我的问题是我不知道如何指示该函数可以一次在多个元素上调用自身 例如扫描图形的函数 有人有什么建议吗 在流程图中 您通常不会为循环之类的内容添加多次调用 您只需指示可以重复调用代码 直到满足条件为止 因此 对于递
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • 理解基本递归

    public static void main String args System out println factorial 5 public int factorial int n if n lt 1 return 1 else re
  • Java 递归和性能

    递归对处理器和内存的影响是否很大 我的意思是 我的一个线程有一个方法 很可能会调用自身 假设它每秒可以自调用一次 我的应用程序应该运行至少 24 小时而不停止 因此它提供了 60 60 24 86400 个自调用方法 它对第二个 主 线程有
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加

随机推荐

  • 无法从 android 4.0 启动主页

    我想从我使用的应用程序启动主屏幕 Intent intent new Intent Intent ACTION MAIN intent addCategory Intent CATEGORY HOME intent setFlags Int
  • Springdoc Swagger UI 不使用 swagger-config

    需要一些有关 springdoc openapi ui 的帮助 我正在使用 springdoc openapi ui 来呈现我的 API 模式 这是它的版本详细信息 Now i have done some configuration in
  • 绝对定位的弹性项目不会从 IE11 中的正常流程中删除

    我们有两个包含内容的 div 第三个 div 是具有绝对位置的背景 容器是一个弹性盒子 All works fine in Chrome and Safari but Firefox and IE11 factors in the abso
  • UIApplication.sharedApplication().setStatusBarStyle() 在 iOS 9 中已弃用

    我一直在使用 UIApplication sharedApplication setStatusBarStyle 在我的 appDelegate 中 它工作得很好 但从 iOS 9 开始 这个方法已被弃用 我找不到替代方法 我想将整个应用程
  • 让div出现并将整个html更改为更暗

    我有一个 div 单击按钮后 我希望 div 出现 我可以做到 但我希望整个背景也变得更暗 这与叠加层内联 我尝试过使用不透明度 我使用 jQuery 更改整个 html 的不透明度 即 html css opacity 0 5 并将 di
  • Bootstrap 示例中未显示数据表按钮

    知道为什么在使用此代码进行引导时按钮 csv excel pdf 打印等 不显示吗 https datatables net extensions buttons examples styling bootstrap4 html https
  • CSS负右背景位置

    我知道我可以在背景图像上设置负左位置 如下所示 element background url image png 20px 0 no repeat 这会将背景图像定位到左边缘左侧 20px element 不管 element的宽度 但是有
  • python,即时动态实现一个类

    假设我有一个实现多种方法的类 我们希望用户选择在现有方法中运行哪些方法 或者他可以决定添加任何 on the fly 方法 从例子 class RemoveNoise pass 然后根据需要添加方法 RemoveNoise raw Raw
  • 如何在 JavaScript 中将变量从一个文件发送到另一个文件? [复制]

    这个问题在这里已经有答案了 我想从页面发送用户名和密码login html to index html 我怎样才能尽可能简单地做到这一点 以及如何对字符串进行编码 使其采用 URL 编码和 UTF 8 Cheers 您可以使用cookies
  • git 如何处理文件夹权限?

    我正在使用 git 版本 1 5 6 3 并且 git 似乎没有注意到文件夹模式的更改 create a test repository with a folder with 777 mode mkdir p test folder tou
  • 在 Mac OS X 上打开磁盘设备文件进行写访问

    我正在尝试对 Mac 上的磁盘分区表进行细微修改 特别是 我需要更改分区的类型 diskutil不支持这个 所以我不能使用它 它工作正常 例如通过修改gpt命令行实用程序 如果磁盘未使用 如果是 则打开设备文件失败 int fd open
  • Dart List - 子类型过滤器

    在我的 dart 项目中 构造经常出现在许多情况下 对于具有子类型的类型列表 此代码将子类型过滤到新列表中 class A class AChild extends A List a alist new A new AChild List
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 如何在不使用“Qt项目”的情况下在Eclipse中设置QT路径?

    我有一个在 Eclipse 中管理的混合 C Qt Python 项目 我想设置 Qt 路径 而不将我的项目设置为 Qt 项目 使用 CDT 并将其设置为常规 来自现有代码的 Makefile 项目 我在项目属性中找不到任何可以设置 Qt
  • 可以自定义printf吗?

    我有一些需要经常打印的结构 现在 我在这个结构周围使用经典的打印包装器 void printf mystruct struct my struct if my struct NULL return printf value1 d value
  • 有没有办法将行号重新引入堆栈跟踪?

    我正在使用一个库 它通过直接抛出一个对象来混淆错误 我相信 Functions a b b2 c are all in a library that I don t have control over function a console
  • 如何为 JDialog 设置圆角的 3D 边框?

    我可以向 JDialog 添加圆角边框 如下所示如何在 Java Swing 中创建圆形标题边框 https stackoverflow com questions 3056089 how to create a rounded title
  • 如何在 Presto 中将时间戳转换为日期?

    我喜欢将时间戳列转换为日期和时间格式 我应该如何从 presto 编写查询 我的时间戳是UTC时间 非常感谢 Timestamp format 1506929478589 After query convert it looks like
  • Android 键盘“前往”按钮至“搜索”

    任何人都可以告诉如何用 搜索 代替 Android 键盘中的 执行 或 完成 按钮 不是放大镜 像这样的东西 android imeOptions actionSearch 可能会起作用 在你的情况下 还有其他选项 例如 android i
  • 如何反转列表?

    在Scheme中反转列表的函数是什么 它需要能够处理嵌套列表 所以如果你做类似的事情 reverse a b c d e 你会得到 e b c d a 作为输出 我应该如何解决这个问题 我不仅仅是在寻找答案 而是寻找有助于我学习的东西 de