gpt4 book ai didi

syntax - 不了解 SICP 中的方案程序

转载 作者:行者123 更新时间:2023-12-04 18:42:00 24 4
gpt4 key购买 nike

我正在研究 SICP 第 1 章“1.3 用高阶公式化抽象
手续"

我(目前)遇到问题的部分是程序模板(如下所示)通过将其“插槽”转换为形式参数而转换为实际过程(如下所示)。我不明白他们到底从哪里得到 下一页 在转换过程结束时(就在右括号之前)?

当然只是 b 和模板一样?

无论如何,这是模板......

(define (<name> a b)
(if (> a b)
0
(+ (<term> a)
(<name> (<next> a) b))))

这是参数槽填满后的过程
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))

非常感谢任何照明

最佳答案

这里要理解的关键见解是,在 Scheme 中,我们可以将函数作为参数传递给另一个函数,就像我们传递数字一样容易。请注意,模板不完整,应该是:

(define (<name> <term> a <next> b)
(if (> a b)
0
(+ (<term> a)
(<name> <term> (<next> a) <next> b))))

从模板到实际过程的转换很简单:
  • <name> 是程序名的占位符,正好是sum
  • <term> 是应用于系列中每个术语的过程的占位符,在实际过程中它也称为 term 但它可以有任何其他名称 - 例如,identity 将是传递
  • 的有用过程
  • <next> 是计算系列中下一个元素的过程的占位符,例如它可以像传递 add1 一样简单,但作者选择也称它为 next

  • 实际过程末尾的 next b 部分只是为函数的递归调用提供 next (一个函数)和 b (一个数字)参数,这是最后一行中传递的内容:
        (sum            term             (next a)     next             b)
    ^ ^ ^ ^ ^
    function call "term" function next number "next" function upper limit

    另请注意, (next a) 实际上将 next 过程应用于 a 参数,并将该应用程序的结果传递给递归 - 事实上,这是调用之间唯一变化的值,它有效地推进递归直到点当 (> a b) 变为假时。这与倒数第二个参数中发生的情况不同,我们在其中传递 next ,函数本身而不是应用它的结果。例如,以下是调用 sum 过程以添加 110 之间的所有数字的方法:
    (sum identity 1 add1 10) ; <term> is `identity` and <next> is `add1`
    => 55

    关于syntax - 不了解 SICP 中的方案程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24038769/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com