第五章 分支.pdfVIP

  • 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)

1亿VIP精品文档

相关文档