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怎么都需要嵌套很不方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值