sicp习题试解 (2.16)

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

; ======================================================================

;

; Structure and Interpretation of Computer Programs

; (trial answer to excercises)

;

; 计算机程序的构造和解释(习题试解)

;

; created: code17 07/14/05

; modified:

; (保持内容完整不变前提下,可以任意转载)

; ======================================================================

;; SICP No.2.16

;; 注意: 对于本题,本人目前尚无完全之解答(代码),但基本思路如下:

;; 采用原有的思路肯定是行不通的,当(operator partA partB)以后, 其结果总是一个

;; 绝对的区间值,而partA和partB中所含的自由变元(设为x,y,...)的信息则全部丢失。

;; 如果将这个结果与其他操作数(partC等)继续运算,则partC具有的同样的自由变元x,y...

;; 将无法与(operator partA partB)中同一个自由变元同步——因为前者已经成为绝对

;; 区间值的一部分,因而同样的x,y...在不同部分中,已经成为互相独立的变元。因此,

;; 原来的思路是行不通的。

;; 一个可行的思路是这样的:

;; (因我目前尚欠缺scheme语法知识——比如高级抽象数据类型等,仅用现有的pair等结构

;; 实现起来代码过于笨拙,所以暂时没有给出代码)

;; 具体思路是: 当一个op作用于两个part的时候,我们并不是立即求值,而是

;; 1. 将其操作存入抽象数据结构,以后再计算

;; 2. 检查两个part各自存在的自由变元,然后合并成一份

;; 3. 利用最终得出的自由变元列表和抽象数据类型的表达式,对各个变量的范围求导,

;; 从而获得各个区间的极大极小,然后比较这些极大极小,获取最终的范围。

;;

;; 抽象数据类型递归定义:

;; TYPE Part = Exp and (Name List)

;;

;; TYPE Exp = VAR (Name)

;; or CONST (float)

;; or ADD EXP EXP

;; or MIN EXP EXP

;; or MUL EXP EXP

;; or DIV EXP EXP

;;

;; 其中单个自由变量"x"对应的Part为(VAR("x"), ["x"])

;; 单个常数"c"对应的Part为(CONST(c), [])

;; 其他part中的Exp和Name List则由对各种操作的递归定义可得, 比如

;; add-interval part1 part2 =

;; match part1 as (exp1, namelist1)

;; match part2 as (exp2, namelist2)

;; ==> (ADD exp1 exp2, combine namelist1 namelist2)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有