自定义地图功能 - 它是如何工作的?

2023-11-30

对于不清楚的主题标题,我深表歉意。

我在计划中有这个函数,它是map功能。它工作得很好,但我在试图理解它时迷失了方向。

(define (my-map proc . ls)
  (letrec ((iter (lambda (proc ls0)
                   (if (null? ls0)
                       '()
                       (cons (proc (car ls0)) 
                             (iter proc (cdr ls0))))))
           (map-rec (lambda (proc ls0)
                     (if (memq '() ls0)
                         '()
                         (cons (apply proc (iter car ls0)) 
                               (map-rec proc (iter cdr ls0)))))))
    (map-rec proc ls)))

问题在于cons (proc (car ls0))。如果我是对的,当经过时(1 2 3) (4 5 6) to the ls参数的实际值将是((1 2 3) (4 5 6))。所以iter car ls0 in map-rec将传递(1 2 3) to iter. Hence proc (car ls0) in iter将具有以下形式:(car (car (1 2 3))),但这不可能,对吧?

我知道我的想法在某个地方有缺陷,但我不知道在哪里。


这是理解该过程的一种方法:

  • The iter助手是一样的map,但在单个列表上操作。
  • The map-rec帮助者概括iter,处理列表列表,当至少一个列表为空时停止
  • 这部分:(apply proc (iter car ls0))将过程应用于每个列表的第一个元素;打电话给iter创建一个列表car部分清单
  • 这部分:(map-rec proc (iter cdr ls0))同时对所有列表进行递归;打电话给iter创建一个列表cdr部分清单

也许重命名这些过程会让事情变得清晰。这是一个完全等效的实现,明确了以下事实:map-one对单个列表进行操作并且map-many对列表的列表进行操作:

(define (map-one proc lst)  ; previously known as `iter`
  (if (null? lst)
      '()
      (cons (proc (car lst))
            (map-one proc (cdr lst)))))

(define (map-many proc lst) ; previously known as `map-rec`
  (if (memq '() lst)
      '()
      (cons (apply proc (map-one car lst))
            (map-many proc (map-one cdr lst)))))

(define (my-map proc . lst) ; variadic version of `map-many`
  (map-many proc lst))

它的工作原理就像原来的一样my-map:

(my-map + '(1 2 3) '(4 5 6) '(7 8 9))
=> '(12 15 18)

你可以检查一下map-one确实是一个map适用于单个列表:

(map-one (lambda (x) (* x x))
         '(1 2 3 4 5))
=> '(1 4 9 16 25)

看看效果(map-one car lst)在列表列表中:

(map-one car '((1 4 5) (2 6 7) (3 8 9)))
=> '(1 2 3)

同样,看看如何(map-one cdr lst) works:

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

自定义地图功能 - 它是如何工作的? 的相关文章

  • 哪个更快?按引用传递与按值传递 C++

    我认为按引用传递应该比按值传递更快 因为计算机不复制数据 它只是指向数据的地址 但是 请考虑以下 C 代码 include
  • 从when语句内的函数返回

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

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 在堆栈已满并给出分段错误之前,C/C++ 中的最大递归函数调用次数?

    我正在做一个问题 我使用递归函数来创建线段树 对于较大的值 它开始出现分段错误 所以我之前认为可能是因为数组索引值越界 但后来我认为这可能是因为程序堆栈太大 我编写这段代码是为了计算系统出现段错误之前允许的最大递归调用次数 include
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • 为什么重载方法的类型提升优先于可变参数

    public class Test public static void printValue int i int j int k System out println int public static void printValue b
  • 通往楼梯顶部的可能路径

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

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 我在函数的最后一次递归调用中得到“方案应用程序而不是过程”

    所以这是代码 define time prime test n newline display n start prime test n runtime define start prime test n start time if pri
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 理解基本递归

    public static void main String args System out println factorial 5 public int factorial int n if n lt 1 return 1 else re
  • 函数式 Scala 中的选择排序

    我正在学习 Scala 编程 并编写了选择排序算法的快速实现 然而 由于我对函数式编程还不太了解 所以在转换为更 Scala 风格时遇到了困难 对于 Scala 程序员来说 如何使用 Lists 和 vals 来做到这一点 而不是回到我的命
  • 卷积函数可以写成尾递归形式吗?

    我有一个函数 我想以尾递归形式编写 该函数计算求和的方法数k通过滚动s双面模具n次 我已经在上面看到了这个函数的数学解这个答案 https math stackexchange com questions 397689 why convol
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • python解释器自动重启而不返回答案

    调用递归函数时 python解释器会自动重新启动吗 我正在编写一个快速排序算法 并尝试对一个大的数字数组 顺序 10 4 进行排序 但是当我尝试对整个数组进行排序时 python 正在重新启动 即给我 重新启动 并且存储在内存中的所有值 函
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant

随机推荐

  • hive xml serDe:表为空

    我想将 xml 数据存储到 hive 表中 XML 数据
  • “嵌入” UIViewController 到另一个中

    我有一个 UIViewController DetailViewController 由顶部的导航栏和覆盖屏幕其余部分的 UIView 组成 是否可以使用 DetailViewController 以外的 UIViewController
  • Python正则表达式解析

    我在 python 中有一个字符串数组 数组中的每个字符串看起来像这样
  • ValueError:合并时不允许负尺寸

    我正在将 2 个数据框合并在一起 他们原本是 csv每个文件只有 7 MB 2 列和 290 000 行 我这样合并 merge pd merge df1 df2 on POINTID how outer 在 32 位 Anaconda 中
  • 将矩阵每列中的 NA 替换为该列的中值

    我试图用该列的中位数替换矩阵每一列中的 NA 但是当我尝试使用lapply or sapply我收到一个错误 当我使用 for 循环并且一次更改一列时 代码有效 我做错了什么 Example set seed 1928 mat lt mat
  • 在php中获取当前一周的第一天和最后一天

    如何获取并显示本周第一天和最后一天的日期 所以在本周它将输出 2012 05 14 2012 05 20 今天是2012年5月17日 这怎么能简单地做到呢 try use 斯特托时间 first date Y m d strtotime l
  • FREETEXTTABLE 为什么或如何给出比其他人更高的排名值

    有一个存储过程在两个表上使用 FREETEXTTABLE 两次 然后合并结果并返回前 50 个 问题是 如果我搜索 Women of Brewster 结果会返回表 A 中排名为 143 的 Confession of an ex doof
  • jquery 一个滑块控制另一个

    如何让一个 jquery ui 滑块控制另一个 如果我滑动滑块 1 它也应该滑动滑块 2 创建滑块 1 时提供滑动 更改函数 该函数使用滑块 1 上正在更改的手柄的 ui value 并设置滑块 2 上的手柄值 根据滑块的手柄数量 您需要调
  • 强制使用 const 对象的 C++ 类

    首先让我问一个一般性问题 在我看来 C 是一种语言 其目的是提供大量功能 为程序员提供最大可能的灵活性 以他认为合适的方式做事 换句话说 它是一种灵活的语言 它允许程序员以比我见过的任何其他语言更多的方式表达自己 这是正确的吗 然后是具体的
  • static_cast(*this) 和 static_cast(*this) 之间的区别

    在下面的代码中 取自Effective C class A char operator std size t position now just calls const op return const cast
  • 如何正确调用setListAdapter

    我已经搜索了很多如何解决这个问题 但没有得到任何结果 我需要的唯一帮助是 请看一下 stackoverflow 上提出的这个问题和答案 这是来自的问题this link 我的活动不扩展 ListActivity 因此此行会引发错误 setL
  • 获取进程/线程的上下文切换次数

    出于好奇 我想知道我的程序被操作系统切换了多少次上下文 就像所有寄存器都被保存并且控制权被传递给另一个进程或线程一样 然后一段时间后一切都恢复了 我们继续 因为它从未发生过 系统是否在某个地方维护了这样的数字 或者是否存在某种黑客行为或其他
  • 将标签与其各自的字段 Swing 一起排列

    我需要将所有字段与相应的标签对齐 这是我的代码 public class Progress extends JPanel implements ActionListener public JLabel ClientIP JTextField
  • 错误渲染视图:java.lang.IllegalStateException:已为此响应调用 getOutputStream()

    我正在 JSF 和 spring 中创建一个项目 其主要目的是在浏览器中生成 PDF 文件 一切看起来都很好 也生成了 pdf 但在控制台上我遇到了这个异常 有人对此有任何想法吗 我搜索了一下 发现很多人都有这个问题 但我没有找到适合我的问
  • CSS、嵌套 div 和边距与填充

    我完全理解盒子模型 这个问题更多的是试图确定关于何时使用边距和何时使用填充的语义方法 这是一个典型的例子 首先 用简单的英语来说 情况 我们有一个容器div 里面有一个段落元素 目标 在 div 内部和段落外部之间有 12px 的空间 选项
  • C# Windows Universal 10 TopMost 窗口

    我正在开发一个 Windows 10 通用应用程序 UWP 是否可以将应用程序设置为 TopMost 始终位于顶部 喜欢WPF or Winforms 最上面的属性 Thanks Creators Update 中添加了一项名为 Compa
  • 映射两个列表[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我最近问了一个关于使用apply函数作用于两个列表 每
  • 什么 SQL 查询或视图将显示“动态列”

    我有一个数据表 我允许人们向该表添加元数据 我为他们提供了一个界面 允许他们将其视为向存储数据的表添加额外的列 但实际上我将数据存储在另一个表中 Data Table DataID Data Meta Table DataID MetaNa
  • CSS 元素恢复默认样式

    CSS 中有没有一种快速的方法来删除应用于元素的所有样式 例如 假设某种选项卡菜单 div class outer div div div div div div div div div CSS 应用 outer foo blee bar
  • 自定义地图功能 - 它是如何工作的?

    对于不清楚的主题标题 我深表歉意 我在计划中有这个函数 它是map功能 它工作得很好 但我在试图理解它时迷失了方向 define my map proc ls letrec iter lambda proc ls0 if null ls0