【SICP练习】26 练习1.32



练习1.32

因为递归比迭代要更容易实现,因此我先考虑的递归。先将sum和product都列出来。

(define (sum term a next b)

(if(> a b)

0

(+(term a)

(sum term (next a) next b))))

(define (product term a next b)

(if(> a b)

1

(* (term a)

(product term (next a) next b))))

通过对比我们发现,仅仅是有2个地方的区别。按照题中的要去,我们将0或1的位置用null-value代替,将+或*用combiner代替。在函数的参数中添加这两个新的参数即可。通过对比,其实也不难嘛。

(define (accumulate combinernull-value term a next b)

(if (> a b)

null-value

(combiner (term a) (accumulate combinernull-value term (next a) next b))))

题中还要求我们定义出sum和product来,这里我就列出sum的递归accumulate版本。

(define (sum term a next b)

(accumulate + 0 term a next b))

接下来我们再看看如何写出迭代版本的accumulate。还是一样,先列出迭代版本的sum和product。

(define (sum term a next b)

(define (sum-iter a other)

(if (> a b)

other

(sum-iter (next a)

(+(term a) other))))

(sum-iter a 0))

(define (product term a next b)

(define (product-iter a other)

(if (> a b)

other

(product-iter (next a)

(* (term a) other))))

(product-iter a 1))

同样是通过类比,我们又可以写出迭代版本的accumulate。

(define (accumulate combinernull-value term a next b)

(define (accumulate-iter a other)

(if (> a b)

other

(accumulate-iter (next a)

(combiner (term a)other))))

(accumulate-iter a null-value))

这次我们就来写迭代版本的product。

(define (product term a nextb)

(accumulate * 1 term a next b))

通过这些对比,感觉枯燥的递归和迭代还挺有意思的。

时间: 2024-10-05 07:19:19

【SICP练习】26 练习1.32的相关文章

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

Linux GDB程序调试工具使用简介

GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) 当程序被停住时,

cocos2dx 制作单机麻将(一)

今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos2dx部分, 由于要把这部分留到后面讲,主要是还在考虑用3d做还是用2d做. 到最后能够扩展AI部分的机器人 和 server模块 麻将逻辑1. 打乱麻将顺序(初始化牌堆) 国标麻将共同拥有144张牌 #define MAX_REPERTORY 144 先把全部的牌放入一个常量数组中保存 每种牌都是

主板不支持新CPU的原因

主板不支持新CPU的原因 目前CPU按照摩尔定率,频繁在不断的升高.而不少网友想在自己原来主板的基础上升级(主板在购买时可是花了不少银子,换掉太可惜了).但是往往装上新的CPU后,却黑屏不能启动.于是乎按照DIY规律升级BIOS,以便支持新的CPU.但升级BIOS后相同芯片组的主板,有的支持新的CPU,但有些却又不支持:那么相同的芯片组,为什么会出现两种情况呢? 其实是否支持新的CPU,有几点必须具备的条件:一是主板的CPU插座是否适合于新型CPU:二是主板是否提供CPU所需要的外频:三是主板是

在Windows下MyEclipse运行JAVA程序连接HBASE读取数据出错

运行环境:Hadoop-2.5.0+Hbase-0.98.6 问题描述: 15/06/11 15:35:50 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.     at org.apache.hadoop

centos6.5 安装rabbitMQ3.6.6

1.安装依赖包 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel  unixODBC unixODBC-devel 2.安装语言环境Erlang 2.1 下载 http://erlang.org/download/otp_src_19.2.tar.gz 2.2 安装 解压 tar zxvf otp_src_19.2.tar.gz cd otp_src_19.2 配置 '--prefix'指定的安

1926: [Sdoi2010]粟粟的书架

1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 807  Solved: 321[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都摆有一本书,上数第i 行.左数第j 列 摆放的书有Pi,j

L2-009. 抢红包

没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢红包的记录,请你统计一下他们抢红包的收获. 输入格式: 输入第一行给出一个正整数N(<= 104),即参与发红包和抢红包的总人数,则这些人从1到N编号.随后N行,第i行给出编号为i的人发红包的记录,格式如下: K N1 P1 ... NK PK 其中K(0 <= K <= 20)是发出去的红包个数,Ni是抢到红包的人的编号,Pi(> 0)是其抢到的红包金额(以分为单位).注意:对于同一个人发出的红包,每人最多只能抢1次,不能重

spark机器学习-第3章

1.安装工具ipython https://www.continuum.io/downloads 选择自己需要的版本 2.安装过程 (1)赋权限 chmod u+x ./Anaconda2-4.2.0-Linux-x86_64.sh (2)回车 [[email protected] tool]# ./Anaconda2-4.2.0-Linux-x86_64.sh Welcome to Anaconda2 4.2.0 (by Continuum Analytics, Inc.) In order