代入求值
(define (sq x) (* x x))
(define (sqsum a b)
(+
(sq a)
(sq b)))
(define (f z)
(sqsum z (+z 1)))
上面表达是求: f(z) = z2 + (z + 1)2
- 函数慢慢拆开 参数代入
(f 5)
(sqsum 5 (+ 5 1))
(+ (sq 5) (sq (+ 5 1)))
(+ (* 5 5) (* (+ 5 1) (+ 5 1)))
> 61
递归
- 求绝对值
(define (abs a)
(if (> a 0)
a
1 - a ))
(abs 1)
> 1
(abs -1)
> 1
- 求一个正整数的阶层
f(n) = n!
if n === 1,n = 1
if n === 2,n = 1 * 2
if n === 3,n = 1 * 2 * 3
if n === n,n = 1 * 2 * 3 * ... (n - 1) * n
if n === 1,n = 1
if n === 2,n = fn(1) * 2
if n === 3,n = fn(2) * 3
if n === n,n = fn(n - 1) * n
(define (f n)
(if (= n 1)
1
(* n (f (- n 1)))
)
- 为什么递归叫做递归
(f 6)
(* 6 (f 5))
(* 6 (* 5 (f 4)))
(* 6 (* 5 (* 4 (f 3))))
(* 6 (* 5 (* 4 (* 3 (f 2)))))
(* 6 (* 5 (* 4 (* 3 (* 2 (f 1))))))
(* 6 (* 5 (* 4 (* 3 (* 2 1)))))
(* 6 (* 5 (* 4(* 3 2))))
(* 6 (* 5 (* 4 6)))
(* 6 (* 5 24))
(* 6 120)
> 720
先递进全部代入 再 回归一步一步求值
迭代
- 同样是求6的阶层
1! = 1
2! = 2 * 1!
3! = 3 * 2!
4! = 4 * 3!
5! = 5 * 4!
6! = 6 * 5!
f(6)
(j 1 1 6) // 第一个参数是结果 第二个参数是算的次数 第三个参数是要算多少次。
(j 2 2 6)
(j 6 3 6)
(j 24 4 6)
(j 120 5 6)
(j 720 6 6)
(j 720 7 6) // 因为第二参数 大于算的次数 所以结果就是 720
高阶函数
一个函数接受别人的函数,就叫高阶函数