【SICP练习】27 练习1.33



练习1.33

题目第二行描述,只组合起由给定范围得到的项里的那些满足特定条件的项,因此我们需要在这一版本的accumulate中添加一个need-filter?,这个新的谓词可以用来传递下面就要用到的prime?。

(define (filtered-accumulateneed-filter? combiner null-value term a next b)

(if (> a b)

null-value

(let ((other-term (filtered-accumulateneed-filter?

combiner

null-value

term

(nexta)

b)))

(if (need-filter? a)

other-term

(combiner (term a) other-term)))))

因此我们就可以通过accumulate来构造一个求a到b之间所有素数的和了。就像上一道题中将accumulate补充称product等一样,这里也是将抽象的filtered-accumulate添加一些固定的元素让它稍微”具体“点。a小题的函数也就出来了。

(define(accumulate-prime-sum a b)

(filtered-accumulate prime? + 0 (lambda (x)x) a (lambda (x) (+ x 1)) b))

编译这段函数的前提是你已经将prime?加载上来了。

其实解答b小题就是要写出一个能够判断互素的谓词,这里定为a-prime-to-b?。

(define (a-prime-to-b? a b)

(and (< a b) (= 1 (gcd a b))))

同样的,在这里也应该要将gcd函数加载上来。

类似于前面将need-to-filter?替换成prime?的过程,这里是用的谓词a-prime-to-b?。

(define (product-of –prime-accumulaten)

(filtered-accumulate (lambda (x) (a-prime-to-b?x n))

*

1

(lambda (x) x)

1

(lambda (x) (+ x 1))

n))

作为初学者,还是多做点实践好了,再来写出迭代版本的filtered-accumulate

我就不再将我对比的过程写下来了,大家可以翻到前面看看。

(define (filtered-accumulateneed-to-filter? combiner null-value term a next b)

(define (filtered-accumulate-iter a other)

(cond ((> a b) other)

((need-to-filter? a)

(filtered-accumulate-iter (nexta) (combiner (term a) other)))

(else

(filtered-accumulate-iter (nexta) other))))

(filtered-accumulate a null-value))

这道题我们就这样写完了,接下来我们会开始着重学习lambda了。虽然前面用过不少,但要想灵活运用lambda则比较难了。个人理解,lambda就像是C语言中的指针,灵活运用则威力强大。

时间: 2024-11-04 15:02:31

【SICP练习】27 练习1.33的相关文章

SICP 1.27 1.28体会

这2题目, 还算比较简单. 做了3天的题,最大的痛苦就是还不大会调试, 所有代码均靠大脑分析,太痛苦了. 最坑的就是, 经常漏函数参数, load的时候系统也不报错, 运行时的错误提示又如同天书, 看来还是先要找本讲scheme的书先学习下,否则效率太低了. 1.27 主要是写个迭代代码, 测试所有2到n-1.代码如下: (define (prime-test n) (define (prime-test-iter start end) (if (> start end) true (if (f

09.27日记(2014年9月27日10:33:50)

耳机 POI.chart 图表.地图 排行榜--网页链接.优酷创收--每周抓取.小说,书籍.读书笔记 纯CSS.地图应用.HFLS的计算方式 (1)OpenStreetMap :官网.OSC简介 (2)Pure:官网.中文版.中文版Git.OSC简介 (3)那些网站:USPCAT .极客标签.慕课网.devstore.

mootools1.5.1使用笔记:类的创建,继承,为现有类增加新方法

1 window.addEvent('domready',function(){ 2 /* 3 新建一个Person的类,类上有 name属性和sayHello方法: 4 */ 5 var Person= new Class({ 6 initialize: function(name){ 7 this.name = name; 8 }, 9 sayHello:function(){ 10 console.log('hello,my name is '+this.name); 11 } 12 13

07-查询操作(DQL)-多表查询

一. 综述   查询操作主要从两个方面来说:单表查询和多表查询. 多表查询包括:笛卡尔积.外键约束.内连接查询.外链接查询.自连接查询. 二 . 案例设计   1.  设计产品表(product).包括:主键id.产品名称(productName).分类编号(dir_id).零售价(salePrice).供应商(supplier).品牌(brand).折扣(cutoff).成本价(costPrice). 设计产品产品编号表( productdir). 包括:主键id.编号名称( dirName)

[CentOS 7系列]磁盘格式化与挂载

在windows操作系统中,硬盘有fat32和ntfs等多种格式.在linux中同样如此.CentOS 6之前,主要是ext4.ext3和ext2等格式.在CentOS 7这个版本开始,默认的磁盘格式变成了xfs格式. [[email protected] ~]# cat /etc/filesystems xfs ext4 ext3 ext2 nodev proc nodev devpts iso9660 vfat hfs hfsplus * [[email protected] ~]# mou

算法笔记_219:泊松分酒(Java)

目录 1 问题描述 2 解决方案   1 问题描述 泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒".在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:"韩信走马分油"问题. 有3个容器,容量分别为12升,8升,5升.其中12升中装满油,另外两个空着.要求你只用3个容器操作,最后使得某个容器中正好有6升油.

使用Statistics命令查看Netapp存储实时性能统计数据

Cluster-mode下,引入了新的命令行工具,可以查看详细的存储系统性能指标,在进行存储系统诊断时候尤其有用. 注意:使用该命令需要进入高级模式,SSH登录存储CLI环境之后,执行命令:set  –privilege  advanced.参考下图1: 图1 命令使用方法 总览 可以使用命令statistics show-periodic查看当前系统实时的性能指标概览. 图2 样本收集 也可以使用命令statistics start |stop 收集一段时间内的性能参数,然后通过statist

Linux 多网卡Bond自动化脚本

现状: 目前一台物理机4个网卡,em1-em2-em3-em4,需要实现1.2网卡绑定,3.4网卡绑定,模式为主备.即:一个网卡处于活动状态 ,一个处于备份状态,所有流量都在主链路上处理.当活动网卡down掉时,启用备份的网卡 附:linux有七种网卡绑定模式:0. round robin,1.active-backup,2.load balancing (xor),  3.fault-tolerance (broadcast), 4.lacp,  5.transmit load balanci

Scala 具体的并行集合库【翻译】

原文地址 本文内容 并行数组(Parallel Array) 并行向量(Parallel Vector) 并行范围(Parallel Range) 并行哈希表(Parallel Hash Tables) 并行散列 Tries(Parallel Hash Tries) 并行并发 Tries(Parallel Concurrent Tries) 参考资料 并行数组(Parallel Array) 一个 ParArray 序列包含线性.连续的元素数组.这意味着,通过修改底层数组,可以高效地访问和修改元