欧几里得算法过程:
(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)