- 论坛徽章:
- 0
|
Exercise 1.20. 答案
应用序比较简单,把它放前面来。
(2) 应用序
辗转序列为 206, 40, 6, 4, 2, 0
显然进行了 4 次 remainder.
(1) 正则序
把 reaminder 简单记为 r,分析一下逐步展开的过程
- (if (= b 0) a
- (gcd b (r a b)))
复制代码
继续
- (if (= b 0) a
- (if (= (r a b) 0) b
- (gcd (r a b) (r b (r a b)))))
复制代码
- (if (= b 0) a
- (if (= (r a b) 0) b
- (if (= 0 (r b (r a b))) (r a b)
- (gcd (r b (r a b)) (r (r a b) (r b (r a b))))
复制代码
r 会在两个地方被执行,一是 if 判断 r 的结果是否为 0, 另一个是最终返回的最大公因子,它是用一串嵌套的 r 来求值的。
辗转序列为 205, 40, (r 205, 40), (r 40 (r 205, 40)) , (r (r 205, 40) (r 40 (r 205 40))), .....
设这串数中每个数包含 r 的个数为 a(n),r 的增长模式为
x, y -> (r x y)
所以 a(n)=a(n-1)+a(n-2)+1,这是个什么序列?变个形
a(n)+1 = a(n-1)+1 + a(n-2)+1,a(0)+1=a(1)+1=1.
原来 a(n)=fib(n)-1
辗转序列的值为 205, 40, 6, 4, 2, 0,包含 r 的个数为 0, 0, 1, 2, 4, 7。用 if 进行判断时,r 执行了 1+2+4+7=14 (次).
但返回的最大公因子是辗转序列的倒数第二项,其中含有 4 个 r。所以 r 总共被执行了
(1+2+4+7)+4 = 18 (次).
[ 本帖最后由 win_hate 于 2008-9-11 22:20 编辑 ] |
|