递归计算过程和迭代计算过程
来源:互联网 发布:淘宝客导购网站源码 编辑:程序博客网 时间:2024/05/21 11:24
这次主要想通过几个sicp的题目来说明递归计算过程和迭代计算过程。
(1)阶乘
;递归计算过程(define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n)));迭代计算过程(define (fact-iter counter result) (if (= counter 1) result (fact-iter (- counter 1) (* counter result))))(define (factorial n) (fact-iter n 1))
(2)斐波拉契数列(普通方法)
;递归计算过程(cond 可以类比为C++中的switch,只是它还可以判断范围)(define (Fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (Fib (- n 1)) (Fib (- n 2))))));迭代计算过程(define (Fib-iter n a b) (if (= n 0) a (Fib-iter (- n 1) b (+ a b))))(define (Fib n) (Fib-iter n 0 1))
(3)两个正整数加法(假设存在过程inc(递增1)和过程dec(递减1))
;n++(define (inc n) (+ n 1));n--(define (dec n) (- n 1));递归计算过程(define (+ a b) (if (= 0 a) b (inc (+ (dec a) b))));迭代计算过程(define (+ a b) (if (= a 0) b (+ (dec a) (inc b))))
(4)两个正整数乘法(假设存在过程double(翻倍)和过程halve(减半),基于这个两个已存在的过程,这个算法可以在对数步骤求出结果)
;2*n(define (double n) (* n 2));n/2(define (halve n) (/ n 2));判断是否为偶数(define (even? n) (= 0 (remainder n 2)));需要注意的是:当b为偶数时, a*b = 2 * (a * (b / 2));当b为奇数时, a*b = a*(b-1) + a;递归计算过程(define (* a b) (cond ((= b 0) a) ((even? b) (double (* a (halve b)))) (else (+ a (* a (- n 1))))));迭代计算过程(define (*-iter a b result) (cond ((= b 0) result) ((even? b) (*-iter (double a) (halve b) result)) (else (*-iter a (- b 1) (+ a result)))))(define (* a b) (*-iter a b 0))
(5)求幂b^n(对数步骤)
;n^2(define (square n) (* n n));需要注意的是:当n为偶数时, b^n = (b^(n/2))^2;当n为奇数时, b^n = b^(n-1) * b;递归计算过程(define (fast-expt b n) (cond ((= n 0) 1) ((even? n) (square (fast-expt b (/ n 2)))) (else (* b (fast-expt b (- n 1))))));迭代计算过程(define (fast-expt-iter b n result) (cond ((= n 0) result) ((even? n) (fast-expt-iter (square b) (/ n 2) result)) (else (fast-expt-iter b (- n 1) (* b result)))))(define (fast-expt b n) (fast-expt-iter b n 1))
(6)斐波拉契数列(对数步骤)
;这个算法基于一种比较巧妙的变换规则,用类似于fast-expt的方式压缩求解步骤。;在fib-iter普通算法中,计算过程中的变换方式为a=b, b=a+b, 将此看作为T变换,也就是说Fib通过n次T变换就可以得到结果。;而T变换可以看作是变换族Tpq中p=0且q=1的特殊情况,其中a = a*p + b*q, b = a*q + b*q + b*p;可以证明我们应用Tpq变换两次,等同于应用Tp'q'变换一次,其中p' = p*p + q*q, q' = 2*p*q + q*q;迭代计算过程(define (fib-iter n a b p q) (cond ((= n 0) a) ((even? n) (fib-iter (/ n 2) a b (+ (* p p) (* q q)) (+ (* 2 p q) (* q q)))) (else (fib-iter (- n 1) (+ (* a p) (* b q)) (+ (* a q) (* b q) (* b p)) p q))))(define (fib n) (fib-iter n 0 1 0 1))
- 递归计算过程和迭代计算过程
- 递归计算过程与迭代计算过程
- SICP 习题 (1.9) 解题总结:迭代计算过程和递归计算过程
- 递归过程和递归计算过程
- 迭代和递归计算分数
- 分水岭的迭代计算具体过程解释
- 计算fibonacci数列 - 递归和迭代的效率对比
- 计算阶乘(递归与迭代)
- 形式上的计算和计算过程中的计算
- java计算参数目录大小的递归和迭代实现
- DNS递归与迭代查询次数计算
- 新手村 过程函数与递归 数的计算
- 编辑距离的计算和过程打印
- 存储过程计算报表
- 灰色模型计算过程
- CRC计算校验码过程
- Spark计算过程分析
- 云计算学习过程
- UVALive 4731 Cellular Network
- C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- hdu 1085 Holding Bin-Laden Captive!
- python urllib2模块介绍
- POJ-1273-Drainage Ditches
- 递归计算过程和迭代计算过程
- Makefile中override 指示符
- 关于Android堆内存的设置
- SPOJ 364 - Pocket Money(DP)
- 7zip抽取(extract)NSIS打包exe文件的小bug:一个名为eUseMenu.dll的会被错误抽取为$R0
- C#中的泛型
- Ant 标签说明 [转]
- 如何使用OCR识别控件LEADTOOLS OCR增强Google Drive搜索
- hdu 1085