练习
换零钱方式统计
例:
将1美元换成 半美元,四分之一美元,十美分,五美分,一美分
> (define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
> (define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
> (define (count-change amount)
(cc amount 5))
> (count-change 100)
292函数f由 n<3 : f(n) = n; f >= 3:f(n)=f(n-1) + 2f(n-2) + 3f(n-3)
递归版:
> (define (f n)
(cond ((< n 3) n)
(else (+ (f (- n 1))
(* 2 (f (- n 2)))
(* 3 (f (- n 3)))))))
> (f 3)
4
> (f 4)
11
> (f 5)
25
> (f 1)
1
> (f 2)
2
> (f 8)
335迭代版:
> (define (fun f s l a n)
(cond
((= a n) f)
(else (fun s l (+ l (* 2 s) (* 3 f)) (+ a 1) n))))
> (define (f n)
(fun 0 1 2 0 n))
> (fun 1)
1
> (fun 2)
2
> (fun 3)
4
> (fun 4)
11
> (fun 5)
25
> (fun 8)
335升级版
> (define (fun f s l n)
(cond
((= n 0) f)
(else (fun s l (+ l (* 2 s) (* 3 f)) (- n 1)))))
> (define (f n)
(fun 0 1 2 n))
> (fun 8)
335
> (fun 5)
25
> (fun 4)
11有漏洞:
不能为负数
> (define (fun f s l n)
(cond
((< n 0) n)
((= n 0) f)
(else (fun s l (+ l (* 2 s) (* 3 f)) (- n 1)))))
> (define (f n)
(fun 0 1 2 n))
> (fun 8)
335
> (fun 5)
25
> (fun 4)
11这个例子说明了迭代比递归效率高 ,计算迭代(fun 100000)的时间和计算递归(f 35)的差不多
求幕 运算
递归版:
> (define (fun b n)
(if (= n 0)
1
(* b (fun b (- n 1)))))
> (fun 2 3)
8
> (fun 2 4)
16
> (fun 2 5)
32
> (fun 5 5)
3125
> (fun 2 10)
1024迭代版:
> (define (f b r n)
(if (= n 0)
r
(f b (* r b) (- n 1))))
> (define (fun1 b n)
(f b 1 n))
> (fun1 2 10)
1024
> (fun1 2 5)
32本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!