这个不使用定义的递归 Sheme 函数发生了什么?

贾斯汀桑德斯

我正在阅读一本名为“The Little Schemer”的书,其中这段代码以递归方式呈现,无需定义任何函数即可找到列表的长度。

((lambda (mk-length)
       (mk-length mk-length))
     (lambda (mk-length)
       (lambda (l)
         (cond
           ((null? l) 0)
           (else ( add1
                   ((mk-length mk-length)
                     (cdr l)))))))) 

我有点模糊的想法,即函数被传递了一个工具来让自己变得更多,但是当我尝试充分考虑它时,当我尝试复制类似的东西时,我总是让自己感到困惑。

有人可以更深入地解释一下这里发生了什么,为什么它如此重要(这本书对此非常重要)?

除夕夜

我建议你尝试通过DrRacket逐步解决它

打开时只需粘贴代码,就好像它是一个带有任何列表参数的函数,例如:

(((lambda (mk-length)
   (mk-length mk-length))
 (lambda (mk-length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else ( add1
               ((mk-length mk-length)
                (cdr l))))))))
 '(1 2 3))

在底部的下拉列表中选择选择语言,然后在模式中选择“使用 lambda 的中级学生”。这是一个受限制的方案,具有比标准更少的花哨功能,但您的代码将按编写的方式工作。按 RUN 后,您将看到一个 Step 按钮。按下它,您可以直观地浏览整个过程。

步进器的图像,显​​示了第一步!

这显示步进器正在执行第一步。

注意:DrRacket 的语言“具有 lambda 的中级学生”可能不适用于本书中的所有代码。它是《如何设计程序》一书的一部分,由具有不同复杂性的多种语言组成。请参阅本文档页面中允许的表格DrRacket 支持标准 R5RS、R6RS,并且 R7RS 正在开发中,并且默认情况下它还有一个顽皮的非标准实现,其名称#lang racket为您提供了大量库,但将您锁定为只能在此实现中运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章