文档章节

【SICP练习】85 练习2.57

NoMasp
 NoMasp
发布于 2015/09/08 21:52
字数 394
阅读 4
收藏 0

练习2.57

看到题目中的能处理任意项就赶紧这道题挺难的,同时也想到了前面学过但还没怎么用过的点参数。题目中要能求和还能求乘积。我们先来写求和的函数吧。

(define (make-sum a1 . a2) (if (single-operand? a2) (let ((a2 (car a2))) (cond ((=number? a1 0) a2) ((=number? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list ‘+ a1 a2)))) (cons ‘+ (cons a1 a2))))

随后的sum?和addend等都不变,而augend则要做点修改了。

(define (augend s) (let ((tail-operand (cadd s))) (if (single-operand? tail-operand) (car tail-operand) (apply make-sum tail-operand))))

写好了加法就来写乘积了吧。

(define (make-sum m1 . m2) (if (single-operand? m2) (let ((m2 (car m2))) (cond ((or (=number? m1 0) (=number? m2 0)) 0) ((=number? m1 1) m2) ((=number? m2 1) m1) ((and (number? m1) (number? m2)) (* m1 m2)) (else (list ‘* m1 m2)) (cons ‘* (cons m1 m2))))

同样的,product?和multiplier都不变,而multiplicand则做些变化。

(define (multiplicand p) (let ((tail-operand (cddr p))) (if (single-operand? tail-operand) (car tail-operand) (apply make-product tail-operand))))

apply和map一样都是高阶函数,其作用是将make-product作用于tail-operand上。其余都代码都没有变动。现在就可以用make-product来接受任意个参数了。正因为要能够接受任意个参数,所以在multiplicand等上都使用了递归,在处理多操作符的时候,递归则可以将其不断的分为两个部分。宏观来讲,这也相当于cadr。



为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44079283

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
加载中

评论(0)

【书坊11月赠书福利——第二期】《“笨办法”学Python》 (第3版)

赠书活动停留了一个月,今天开始正常进行,继续每周都给大家送出最新、最好、最实用的技术书。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《“笨办法”学...

生气的散人
2014/11/18
311
0
数据库语句练习

(31)在Visual FoxPro中,以下有关SQL的SELECT语句的叙述中,错误的是______。 A.SELECT子句中可以包含表中的列和表达式 B.SELECT子句中可以使用别名 C.SELECT子句规定了结果集中的列顺序...

长平狐
2013/01/06
66
0
java序列化(七) - fst 序列化

java序列化(七) - fst 序列化 github https://github.com/RuedigerMoeller/fast-serialization 实践 https://gitee.com/mengzhang6/serializable-demo.git maven依赖 开始上手 参考资料 ht......

晨猫
2018/10/23
65
0
运用Riak的MapReduce计算特定课程的平均分

大家好,我是正在学Riak的新新人刚刚加入oschina的大家庭,很多概念还不是很清楚希望大家多多指教 现在又个练习是这样的,要求用riak和MapReduce算法求特定摸个课程的平均分。现在有一堆学生...

Lvunie
2014/01/20
612
0
Jenkins 2.65 发布,可扩展的持续集成引擎

Jenkins 2.65 已发布,Jenkins 是一个可扩展的持续集成引擎,提供了数百个插件来支持项目的构建、部署和自动化。 更新内容(2017-06-11): 当调用 CLI 命令时,阻止 (regression in 2.57). (i...

淡漠悠然
2017/06/15
1.2K
2

没有更多内容

加载失败,请刷新页面

加载更多

Java BigDecimal 如何去掉末尾多余的 0

Java BigDecimal 如何去掉末尾多余的 0 呢? /** * To StripTrailingZeros */ @Test public void bigDecimalStripTrailingZerosTest() { BigDecimal bi......

honeymoose
今天
43
0
齐齐哈尔哪里可以开发票-中国新闻网

齐齐哈尔哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该...

8315581
今天
79
0
衡水哪里可以开发票-中国新闻网

衡水哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种连...

457192
今天
60
0
张家口哪里可以开发票-中国新闻网

张家口哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种...

253878
今天
66
0
黑龙江哪里可以开发票-中国新闻网

黑龙江哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种...

富大范
今天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部