程序设计技术和方法裘宗燕,2 0 1 0 -2 0 1 1 /13. 模 块 化 , 对 象 和 状 态 (4)本次课讨论: 流式计算 流与序列 延时求值 无穷流 流的应用 时间的函数式观点 不同系统模拟方法(函数式、对象、流)的比较程序设计技术和方法裘宗燕,2 0 1 0 -2 0 1 1 /2时间和流 在用状态和赋值模拟的工作中,可以看到赋值带来的复杂性 本节考虑能否用其他方式模拟状态变化 希望能同时避免其中的一些复杂性问题 实际上,这里的复杂性的根源是现实世界中被模拟的现象前面的考虑是: 用有局部状态的计算对象模拟真实中的状态可能变化的对象 用计算机里的系统随着时间的变化模拟现实世界中的变化 通过对有局部状态的对象的赋值,实现计算机系统里的状态变化 现在考虑另一可能性:把一个随时间变化的量表示为一个随时间变化的函数x (t)。这样可得到两个层面的观察: 如果看 x 在一系列具体时刻的值,它是一个随时间变化的变量 如果看 x 的整个历史,它就是一个时间的函数,并没有变化程序设计技术和方法裘宗燕,2 0 1 0 -2 0 1 1 /3流 下面考虑离散时间上的函数 由于是离散时间的函数,可以用无穷长的序列模拟 这种序列称为流。可以用流来模拟状态的变化,模拟一个系统随时间变化的历史 为了做这种模拟,需要引进一种数据结构,也称为流(stream) 不能直接用表结构表示流,因为一般说流可能是无穷的 下面采用延时求值技术,用流表示任意长的序列(潜无穷长) 流技术可用于模拟一些包含状态的系统,构造一些有趣模型 不需要赋值和变动数据结构,因此可以避免赋值带来的问题 流不是万能灵药,使用上有本质性困难下面介绍这些方面情况程序设计技术和方法裘宗燕,2 0 1 0 -2 0 1 1 /4序列和表 前面讨论过用序列作为组合程序的标准接口,构造了许多有用的序列操作抽象,如map、filter、accumulate这些抽象用起来很漂亮 但是用表表示序列,得到好结果的同时可能付出严重的效率代价(空间和/或时间),因为每步操作都可能构造出很大的数据结构 用迭代风格计算一个区间中所有素数之和的过程:(define (sum-primes a b)(define (iter count accum)(cond ((> count b) accum)((prime? count) (iter (+ count 1) (+ count accum)))(else (iter (+ count 1) accum))))(iter a 0)) 用序列操作的组合写同...