1.3 用高阶函数做抽象
最后更新于:2022-04-02 04:17:18
[TOC]
## 过程做为参数
示例
```
#lang racket
;; 计算啊到b的各整数之和
(define (sum-interagers a b)
(if (> a b)
0
(+ a (sum-interagers (+ a 1) b))))
;; 整数立方的和
(define (sum-cubes a b)
(if (> a b)
0
(+ (* a a) (sum-cubes (+ a 1) b))))
;;计算序列之和
(define (pi-sum a b)
(if (> a b)
0
(+ (/ 1.0 (* a (+ a 2))) (pi-sum (+ a 4) b))))
;;可以总结出抽象公式
;; template:
;;(define ( a b)
;; (if (> a b)
;; 0
;; (+ () ( ( a )b))))
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b ))))
;; 重新计算求和
(define (sum-interagers1 a b)
(define (inc n) (+ n 1))
(define (identiry x) x)
(sum identiry a inc b))
(sum-interagers1 1 10)
;; 重新计算立方和
(define (sum-cubes1 a b)
(define (inc n) (+ n 1))
(define (sube n) (* n n n))
(sum sube a inc b ))
(sum-cubes1 1 10)
;; 重新计算 pi-sum
(define (pi-sum1 a b)
(define (pi-term x)
(/ 1.0 (* x (+ x 2))) )
(define (pi-next x)
(+ x 4))
(sum pi-term a pi-next b ))
(pi-sum1 1 10)
```
## 用 ambda构造过程
`$ f(x,y)=x(1+xy)^2+y(1-y)+(1+xy)(1-y) $`
`$ a=1+xy $`
`$ b=1-y $`
`$ f(x,y)=xa^2+yb+ab $`
方式一:辅助过程
```
(define (f x y)
(define (f-helper a b)
(+ (* x (square a))
(* y b)
(* a b)))
(f-helper (+ 1 (* x y)
(- 1 y))))
```
方式二: 使用lambda
```
(define (f x y)
( ((lambda (a b )
(+ (* x (square a))
(* y b)
(( a b)))
(+ 1 (* x y))
(- 1 y)))))
```
方式三:使用 let
```
(define (f x y)
(let ((a (+ 1 (* x y)))
(b (- 1 y)))
(+ (* x (square a))
(* y b)
(* a b))))
```
let的一般形式
```
(let (( )
( )
...
( ))
)
```
也可以让 let 整体作为计算
```
;; 假设x=5
;; let 中的x 赋值3
;; 推导出结果为 33+5=38
(+ (let ((x 3))
(+ x (* x 10)))
x)
```
## 过程的作为一般性方法
```
;; 计算不动点
;; 数x称为函数∫的不动点,如果x满足方程∫(x)=x。对于某些函数,通过从某个初始猜测
;; 出发,反复地应用f
;; f(x),f(f(x)),f(f(f(x))),...
;; 直到值的变化不大时,就可以找到它的一个不动点
(define (fixed-point f first-guess )
(define tolerance 0.0001)
(define (enough? x y)
(< (abs (- x y)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (enough? guess next)
next
(try next))))
(try first-guess))
;; 请cos 的不动点
;; -> 0.7390547907469174
(fixed-point cos 1.0)
;; 求 y=sin y+cos y 的一个解
;; -> 1.2586974741689445
(fixed-point (lambda (y) (+ (sin y) (cos y)))
1.0)
```
';