- 1
- 0
- 约6.22千字
- 约 9页
- 2017-08-22 发布于河北
- 举报
第五章 分支.pdf
第五章 分⽀
5.1 简介
5.2 if表达式
5.3 and和or
5.4 cond表达式
5.5 做出判断的函数
5.6 总结
5.7 习题解答
5.1 简介
上⼀章中,我讲解了如何定义函数 本章中,我会讲解如何通过条件编写过程 这个
是编写使⽤程序很重要的⼀步
5.2 if表达式
if表达式将过程分为两个部分 if的格式如下:
(if predicate then_value else_value)
如果predicate部分为真,那么then_value部分被求值,否则else_value部分
被求值,并且求得的值会返回给if语句的括号外 true是除false以外的任意
值,true使⽤#t表⽰,false⽤#f表⽰
在R5RS 中,false (#f)和空表 (’())是两个不同的对象 然⽽,在MIT-Scheme
中,这两个为同⼀对象 这个不同可能是历史遗留问题,在以前的标准——R4RS
中,#f和’()被定义为同⼀对象
因此,从兼容性⾓度考虑,你不应该使⽤表⽬录作为谓词 使⽤函数null?来判断表
是否为空
(null? ())
;Value: #t
(null? (a b c))
;Value: () ;#f
函数not可⽤于对谓词取反 此函数只有⼀个参数且如果参数值为#f则返回#t,反
之,参数值为#t则返回#f if表达式是⼀个特殊形式,因为它不对所有的参数求
值 因为如果predicate为真,则只有then_value部分被求值 另⼀⽅⾯,如果
predicate为假,只有else_value部分被求值
例:⾸项为a0,增长率r,项数为n的⼏何增长 (geometric progression )数列之和
(define (sum- p a0 r n)
(* a0
(if (= r 1)
n
(/ (- 1 (expt r n)) (- 1 r))))) ; !!
通常来说,⼏何增长数列的求和公式如下:
a0 * (1 - r^n) / (1 - r) (r ≠ 1)
a0 * n (r = 1)
如果if表达式对所有参数求值的话,那么有;!!注释的那⾏就算在r=1时也会被求
值,这将导致产⽣⼀个 除数为0”的错误
你也可以省去else_value项 这样的话,当predicate为假时,返回值就没有被
指定 如果你希望当predicate为假时返回#f,那么就要明确地将它写出来
then_value和else_value都应该是S-表达式 如果你需要副作⽤,那么就应该使
⽤be in表达式 我们将在下⼀章讨论be in表达式
练习1
编写下⾯的函数 阅读第五节了解如何编写谓词
返回⼀个实数绝对值的函数
返回⼀个实数的倒数的函数 如果参数为0,则返回#f
将⼀个整数转化为ASCII码字符的函数 整数可以被转化为33-126
号之间的ASCII码 使⽤inte er-char可以将整数转化为字
符 如果给定的整数不能够转化为字符,那么就返回#f
5.3 and和or
and和or是⽤于组合条件的两个特殊形式 Scheme 中的and和or不同于C语⾔中的约
定 它们不返回⼀个布尔值 (#t或#f),⽽是返回给定的参数之⼀ and和or可以
使你的代码更加短⼩
5.3.1 and
and具有任意个数的参数,并从左到右对它们求值 如果某⼀参数为#f,那么它就返
回#f,⽽不对剩余参数求值 反过来说,如果所有的参数都不是#f,那么就返回最
后⼀个参数的值
(and #f 0)
;Value: ()
(and 1 2 3)
;Value: 3
(and 1 2 3 #f)
;Value: ()
5.3.2 or
or具有可变个数的参数,并从左到右对它们求值 它返回第⼀个不是值#f的参数,
⽽余下的参数不会被求值 如果所有的参数的值都是#f的话,则返回最后⼀个参数的
值
(or #f 0)
;Value: 0
(or 1 2 3)
;Value: 1
(or #f 1 2 3)
;Valu
原创力文档

文档评论(0)