读书人

sicp习题1.20 gcd过程 应用序 正则序

发布时间: 2012-12-27 10:17:10 作者: rapoo

sicp练习1.20 gcd过程 应用序 正则序 remainder次数

(define (gcd a b remainder-count)  (if(= b 0)     (begin (display "\nremainder count: ")            (display remainder-count)            (display "\n gcd result:")            (display a)            (display "\n")            a)     (gcd b (remainder a b) (+ remainder-count 1))))(gcd 12 9 0);(gcd 12 28 0)(define (new-if predicate then-clause else-clause)  (cond (predicate then-clause)        (else else-clause)))(define (gcd-new-if a b remainder-count)  (new-if (= b 0)     (begin (display "\nremainder count: ")            (display remainder-count)            (display "\n gcd result:")            (display a)            (display "\n")            a            )     (gcd-new-if b (remainder a b) (+ remainder-count 1))))(gcd-new-if 12 9 0);(new-if (> 1 2) (begin (display "1") (display "1") )(display "2"))

?以上gcd函数自动记录remainder调用次数。(gcd 12 9 0)调用remainder次数为2次。

if的scheme运算是正则运算,不管怎么样子都是先对谓词求值,然后分支运算。

要使得scheme运算为应用序,则需要使用new-if,自己定义个函数来代替if,由于new-if是自定义的函数,则使用应用序先对其参数顺序求值。因此会导致gcd-new-if 循环调用而产生死循环,并且由于remainder的存在,在循环调用的过程中,remainder a b 的参数b为0时,则发生错误,即求余运算中的除数为0,导致错误。

?

?

读书人网 >网络基础

热点推荐