计算机程序的构造和解释 练习题1.20

欧几里得算法过程:

(define (gcd a b)
  (if(= b 0)
  a
  (gcd b (remainder a b))))

现在我们要按照正则序去展示(gcd 206 40)中产生的计算过程;

 (gcd 206 40)=(gcd 40 (remainder 206 40))
              = (gcd(remainder 206 40) (remainder 40 (remainder 206 40)))
              = (gcd(remainder 40 (remainder 206 40)) (remainder (remainder 206 40)(remainder 40 (remainder 206 40))))
              = (gcd(remainder (remainder 206 40)(remainder 40 (remainder 206 40))) (remainder  (remainder 40 (remainder 206 40))(remainder (remainder 206 40)(remainder 40 (remainder 206 40)))))

上面的计算过程看上去过于繁琐,为了简化他我们用
M0=(remainder 206 40)是一次remainder的计算结果
M1=(remainder 40 M0) 是两次remainder的计算结果
M2=(remainder M0 M1)是四次remainder的计算结果,M0 一次,M1 两次,它本身过程中有一次remainder,所以四次
M3=(remainder M1 M2)是七次remainder的计算结果,M1 两次,M2 四次,它本身过程中有一次remainder,所以七次
然后我们将过程简化

(gcd 206 40)=(gcd 40 M0)
              =(gcd M0 M1)
              =(gcd M1 M2)
              =(gcd M2 M3)

//然后有同学肯定认为最后的计算次数就是M2+M3的次数 = 11次,这里肯定是错的。

//我们再来回顾gcd的过程,每次执行gcd的过程有一步if条件判断,我们上述过程没有考虑条件判断。

(define (gcd a b))
	(if(= b 0))
			a
			(gcd b (remainder a b))

另外,条件判断只有最后一步是执行了true的语句的,其他都是执行了else语句,所以我们加上条件判断的次数后。

(gcd 206 40)=(gcd 40 M0)//条件判断 if(= M0 0),多执行一次
              =(gcd M0 M1)//条件判断 if(= M1 0),多执行两次
              =(gcd M1 M2)//条件判断 if(= M2 0),多执行四次
              =(gcd M2 M3)//条件判断 if(= M3 0),多执行七次,最后一次比较特殊,条件为true,还会执行一次M2,所以是11次

最后我们将结果相加1+2+4+11 = 18次,所以正则序的计算结果是18次

采用应用序是每次将结果传递,if条件语句只是数字的比较,不会触发remainder计算,所以结果会简单很多,每次gcd计算过程都只会触发一次remainder计算,所以一共是4次。

(gcd 206 40)=(gcd 40 6)
              =(gcd 6 4)
              =(gcd 4 2)
              =(gcd 2 0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值