方案: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可帮助您很好地实现的抽象概念。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...