递归,迭代,高阶函数

代入求值

(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

高阶函数

一个函数接受别人的函数,就叫高阶函数

你可能感兴趣的:(递归,迭代,高阶函数)