1. 程式人生 > >SICP讀書筆記2---if和cond的區別

SICP讀書筆記2---if和cond的區別

1.比較形式上面的區別

(1)cond

(cond (<p1> <e1>)

    (<p2> <e2>)

             .......

            (<pn> <en>))

或者

(cond (<p1> <e1>)

    (<p2> <e2>)

             .......

            (else <en>))

(2)if

(if <predicate> <consequent> <alternative>)

2.實際應用上的不同(這裡以DrRacket為IDE)

(1)最大的不同就是一個結果需要進行多個操作的時候

比如我判斷n是否等於0

先換個行(newline)再(display)個什麼東西。

這裡算兩條語句。如果使用if語句就不行。

而使用cond的話,在教學模式下是不行的,不過在選擇語言模式下(比如使用#lang racket)就是可以的。

注:①其實你看1中的兩種形式上的不同就可以知道,cond的每個情況都是用()括起來的,所以裡面的e即使有幾條,都是能夠和下一個條件的p區分開的。

②當然還是有可以在if裡面使用多條語句的辦法,將想要執行的多個語句打包在(begin <e1> <e2> .....)

這樣使用即可。

不過這樣使用終歸沒有cond方便。

③cond中,需要幾個一起執行的語句是不需要單獨用一個()括起來的,直接寫就可以了。

比如:看上去也很清晰。

(define (start-test-3 begin counter)
    (define t1 (runtime))
    (cond ((= counter 0)
                 (newline)
                 (display "OK"))
         

              ((prime? begin)
                (report begin (- (runtime) t1))
                (start-test-3 (+ begin 2) (- counter 1)))
        

             (else
              (start-test-3 (+ begin 2) counter))))

(2)#lang planet neil/sicp,if沒有else的時候

這個環境是專門為sicp開發的

所以支援一些scheme有,但是racket不支援的語法。

比如

(define (test n)
  (if (= n 0)
      (display "OK")))

if語句沒有給出else的情況。

(3)cond優點

個人感覺cond要比if好用很多。

比如在寫一個迭代的時候,如果同時擁有計數結束,以及中間判斷某條件的結束。

使用if的話就有點捉襟見肘,需要巢狀才可以。

比如:

(define (do-the-check n times)
  (cond ((= times n) true)                                                                               。。。。。。。。。。。。A
        ((= (expmod times n n) times) (do-the-check n (+ times 1)))       
        (else false))                                                                                             。。。。。。。。。。。。B

有AB兩種可能使這個迭代結束。A是計數到達n。B是計算expmod不等於n。

使用cond可以很方便地實現這種情況。使用if怎麼都需要巢狀很不方便。