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怎麼都需要巢狀很不方便。