"next" 在这种情况下是什么意思?
What does "next" mean in this context?
我正在阅读 SICP 并使用 Dr Racket SICP 包作为 IDE 和解释器。来自 SICP 的代码:
(define (sum func a next b)
(if (> a b)
0
(+ (func a)
(sum func (next a) next b))))
(define (inc n) (+ n 1))
(define (sum-cubes a b)
(sum cube a inc b))
(define (cube a) (* a a a))
(sum-cubes 1 10)
函数是计算1到10的立方和。但是我不知道next b
是什么意思,因为我们增加的是a
而不是b,增量函数表示为inc
.
所以我删除了 next b
中的 next
然后我得到了错误:
define: duplicate argument identifier in: next
我试图在语法中查找 "next" 但一无所获。
我以某种方式完成了这项工作:
(define (sum func a b)
(if (> a b)
0
(+ (func a)
(sum func (inc a) b))))
(define (inc n) (+ n 1))
(define (sum-cubes a b)
(sum cube a b))
(define (cube a) (* a a a))
(sum-cubes 1 10)
但这似乎很奇怪。 func
被 cube
代替了,所以它很像 C++ 中的函数参数?但是怎么不是(func (inc a))
呢? Scheme 怎么会识别出 func (inc a)
并且知道它需要用 cube
替换它呢?
next
只是一个参数,恰好是一个函数。它传递了值 inc
,因此函数 sum
中的片段 (next a)
正在计算 (inc a)
。下面的 next b
只是将这些值传递给 sum
.
的递归调用
加法
递归调用只是递增传递给 a
的值,并让 b
保持原样。 a > b
时递归停止。在每个级别 func
应用于 a
并添加到正在累积的值中。 func
是示例中的函数 cube
。所以它按预期对多维数据集求和。
这种形式:
(+ a b)
是3个变量的组合。 +
、a
和 b
是变量,Scheme 在应用程序之前以任何顺序评估它们,它采用过程对象和值。
知道用户定义过程中的参数变成变量是非常重要的。他们可以持有 任何值 所以 func
和 next
只是名字。在代码中,您会看到它们正在被应用,例如。它们在运算符位置用括号括起来,这是唯一暗示它们应该是过程的提示。也就是说,除了评论中的文档:-)
在运算符位置以外的其他地方的过程只是一个被传递的值。例如。在 (sum func (next a) next b)
中很明显 next
是一个过程,它用于生成第二个参数并将其作为值传递。它在下一次迭代中绑定到 next
,以便它也可以在那里使用。您实际上可以通过使用闭包来避免这种情况:
;;; sums the numbers a ... b
;;; using procedure func as key and
;;; procedure next to compute next value
;;; example:
;;; (sum (λ (v) (* v 2)) ; func
;;; 1 ; a
;;; (λ (v) (+ v 2)) ; next
;;; 10) ; b
;;; => 50
;;; = (+ 2 6 10 14 18)
(define (sum func a next b)
(define (helper a)
(if (> a b)
0
(+ (func a)
(helper (next a)))))
(helper a))
比上面更清楚的方法是使用named let
,你也可以引入一个累加器,使这个尾部递归,但我想你最终会通过本书来学习这个。
我正在阅读 SICP 并使用 Dr Racket SICP 包作为 IDE 和解释器。来自 SICP 的代码:
(define (sum func a next b)
(if (> a b)
0
(+ (func a)
(sum func (next a) next b))))
(define (inc n) (+ n 1))
(define (sum-cubes a b)
(sum cube a inc b))
(define (cube a) (* a a a))
(sum-cubes 1 10)
函数是计算1到10的立方和。但是我不知道next b
是什么意思,因为我们增加的是a
而不是b,增量函数表示为inc
.
所以我删除了 next b
next
然后我得到了错误:
define: duplicate argument identifier in: next
我试图在语法中查找 "next" 但一无所获。
我以某种方式完成了这项工作:
(define (sum func a b)
(if (> a b)
0
(+ (func a)
(sum func (inc a) b))))
(define (inc n) (+ n 1))
(define (sum-cubes a b)
(sum cube a b))
(define (cube a) (* a a a))
(sum-cubes 1 10)
但这似乎很奇怪。 func
被 cube
代替了,所以它很像 C++ 中的函数参数?但是怎么不是(func (inc a))
呢? Scheme 怎么会识别出 func (inc a)
并且知道它需要用 cube
替换它呢?
next
只是一个参数,恰好是一个函数。它传递了值 inc
,因此函数 sum
中的片段 (next a)
正在计算 (inc a)
。下面的 next b
只是将这些值传递给 sum
.
加法
递归调用只是递增传递给 a
的值,并让 b
保持原样。 a > b
时递归停止。在每个级别 func
应用于 a
并添加到正在累积的值中。 func
是示例中的函数 cube
。所以它按预期对多维数据集求和。
这种形式:
(+ a b)
是3个变量的组合。 +
、a
和 b
是变量,Scheme 在应用程序之前以任何顺序评估它们,它采用过程对象和值。
知道用户定义过程中的参数变成变量是非常重要的。他们可以持有 任何值 所以 func
和 next
只是名字。在代码中,您会看到它们正在被应用,例如。它们在运算符位置用括号括起来,这是唯一暗示它们应该是过程的提示。也就是说,除了评论中的文档:-)
在运算符位置以外的其他地方的过程只是一个被传递的值。例如。在 (sum func (next a) next b)
中很明显 next
是一个过程,它用于生成第二个参数并将其作为值传递。它在下一次迭代中绑定到 next
,以便它也可以在那里使用。您实际上可以通过使用闭包来避免这种情况:
;;; sums the numbers a ... b
;;; using procedure func as key and
;;; procedure next to compute next value
;;; example:
;;; (sum (λ (v) (* v 2)) ; func
;;; 1 ; a
;;; (λ (v) (+ v 2)) ; next
;;; 10) ; b
;;; => 50
;;; = (+ 2 6 10 14 18)
(define (sum func a next b)
(define (helper a)
(if (> a b)
0
(+ (func a)
(helper (next a)))))
(helper a))
比上面更清楚的方法是使用named let
,你也可以引入一个累加器,使这个尾部递归,但我想你最终会通过本书来学习这个。