如何解决方案:SICP中过程参数的目的:1.3高阶过程
在SICP 1.3节中,我们通过引入两个过程作为该过程的参数来抽象求和过程。
(define (sum term a next b)
(if (> a b) 0
(+ (term a) (sum term (next a) next b))))
为什么我们不能这样编写相同的过程:
(define (identity a ) a)
(define (next a) (+ a 1)
(define (sum a b)
(if (> a b) 0
(+ (identity a) (sum (next a) b))))
在这个特定示例中,我无法理解将过程作为参数传递的原因。
有什么特殊原因吗?还是仅出于演示概念的目的?
有没有更好的例子?
解决方法
将过程作为参数传递的原因是,通过这种方式,您可以参数化您的过程,从而改变其行为。当然,在原始版本中,您只需添加所有数字即可,与第二个版本相同:
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(define (identity a) a)
(define (plus1 a) (+ 1 a))
(sum identity 1 plus1 10)
=> 55
但是现在您还可以灵活地计算其他序列,而无需更改原始代码-您只需通过不同的过程即可获得不同的结果。假设您要计算平方和:
(define (square a) (* a a))
(sum square 1 plus1 10)
=> 385
或者您要计算总和,但跳过数字:
(define (plus2 a) (+ 2 a))
(sum identity 1 plus2 10)
=> 25
这是高级程序的强大功能:可定制性和可扩展性,而无需更改基本代码。而且由于过程可以以可组合和可重用的方式编写,因此您有一种非常灵活的方式来考虑计算,而不必一遍又一遍地编写样板代码。
,就像您说的那样求和符号。 如果您学习基础数学,则可能需要计算许多系列。
- 1 + 2 + 3 + ... + n
- 1 / n + 2 / n + 3 / n + ... + n / n
- 0 + 2 + 3 + ... + n
- 1 ^ 2 + 2 ^ + 3 ^ 2 + ... + n ^ 2
- f(1)+ f(2)+ f(3)+ ... + f(n)
- f(1)+ f(3)+ f(5)+ ...
我们可以在很多方面进行思考。
- 摘要:基本摘要。求和表示法我们都在数学课程中学习。所以并不奇怪。
- 修改:在第二个版本中,您必须重写所有代码。首先,不需要。请参见下面的演示。
- 理解:如果人们看到这样的代码:
(define (1/1+1/2+1/3+...+1/k k) (summation / 1 add1 k))
那么我们就像学习它一样,只需要将1 / i形式的和i = 1转换为i = k(此处i≤k)即可。在数学课程中。 - 轻松测试
- 扩展名:也许某天您想扩展到矢量系列。
如果要添加向量系列:vector-1 + vector-2 + ... + vector-n
我们只需要将此
+
函数(在sum
内部)更改为add-vector
并添加if-else
来检查输入是数字还是向量。我们可以设计类似my-inf
的东西,因此可以使用另一种方法来计算1+2+3+...+inf
。 - 新算法或加速技术:如果我们谈论
sqrt
,我们都同意这种抽象很重要,因为我们有很多算法可以计算sqrt
。
#lang racket
(define (sum term a next b)
(if (> a b) 0
(+ (term a) (sum term (next a) next b))))
(define (1+2+...+k k)
(sum identity 1 add1 k))
(define (0^2+1^2+2^2+...+k^2 k)
(sum sqr 0 add1 k))
(define (1+3+5+...+k k)
(sum (λ (n) (- (* 2 n) 1)) 1 add1 k))
(define (1/1+1/2+1/3+...+1/k k)
(sum / 1 add1 k))
(define (1/1^2+1/2^2+1/3^2+...+1/k^2 k)
(sum (λ (n) (/ (sqr n))) 1 add1 k))
; sqr(0)+sqr(2)+sqr(4)+sqr(6)
(sum sqr 0 (λ (a) (+ a 2)) 7) ; 56
;;; TEST
(0^2+1^2+2^2+...+k^2 3) ; 14
(1+2+...+k 100) ; 5050
(1+3+5+...+k 5) ; 1+3+5+7+9=25
(1/1+1/2+1/3+...+1/k 5) ; (+ 1/1 1/2 1/3 1/4 1/5) = 2 + 17/60
(1/1^2+1/2^2+1/3^2+...+1/k^2 3) ; (+ 1 1/4 1/9) = 1 + 13/36
,
如果要计算
f(a0)+ f(a0 + r)+ f(a0 + 2r)+ ...
您不能使用第二张表格,而要使用SICP中的表格。 Scheme可帮助您很好地实现∑的抽象概念。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。