【SICP练习】85 练习2.57

练习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


时间: 2024-09-24 08:02:34

【SICP练习】85 练习2.57的相关文章

歌词同步关键技术

词同步关键技术重大升级!歌词时间快慢调整(全新<高效>思路)自动跟踪引擎(arguments) 运行代码框 <html><head><meta http-equiv=Content-Type content=text/html; charset=gb2312><title>谱乐视听 -- 千言万语</title><STYLE type=text/css>TD { FONT-SIZE: 9pt; LINE-HEIGHT: 1

优化-01背包回溯法计算起来非常慢,有木有算法大大帮忙看看

问题描述 01背包回溯法计算起来非常慢,有木有算法大大帮忙看看 #include #include #include #include #include #include using namespace std; int n;//物品数量 double c;//背包容量 double v[9000];//各个物品的价值 double w[9000];//各个物品的重量 double cw = 0.0;//当前背包重量 double cp = 0.0;//当前背包中物品价值 double best

centos-CentOS安装python2.7.9,竟然自己指向了/usr/local/bin,求原因

问题描述 CentOS安装python2.7.9,竟然自己指向了/usr/local/bin,求原因 在CentOS下安装python2.7.9,(下面会粘出操作history),本来以为按照网上说的,需要在/usr/bin下面改名字,做软链接什么的,发现竟然不用,请大神们解答这是一种什么机制. 命令行里输python,人家就是2.7.9版本了: [fy@VM_70_40_centos bin]$ python Python 2.7.9 (default, Mar 16 2016, 20:55:

Linux/Unix shell 脚本跨服务器跨实例执行SQL

      在DB运维的过程中,难免碰到需要跨多个服务器以及多个Oracle实例查询数据库的情形.比如我们需要查看当前所有生产环境数据库上open_cursor参数的值以便考虑是否需要增加.而需要查看的数据库服务器上有多个实例,同时又存在多个数据库服务器,这样子下来,几十个DB,上百个的情形一个个查,那得把人给累死.那就像点办法撒,写个shell脚本,轮巡所有服务器及服务器上的所有实例.见本文的描述.      关于shell脚本中如何调用SQL,可以参考下列链接:           Linu

JDK7并行计算框架介绍二 Fork/Join开发实例

开发环境: JDK7.0 + Eclipse3.6 + JUnit4 完整代码: 代码文件一:SortTask.java package forktest; import java.util.*; import java.util.concurrent.RecursiveAction; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import junit.*; public

青岛海尔:扩大股权激励范围看好白电龙头发展

事件: 公司公布第二期股权激励草案,授予激励对象1080万份股票期权,行权价格22.31元/股:行权条件为前一年度加权净资产收益率不低于10%,以2009年净利润为基数,行权当年净利润较2009年复合增长率达到或超过18%:在此计划规定的三个行权期激励对象获授的股票期权总量分别为30%.30%.40%. 激励草案覆盖面更广 此次股权激励草案,行权条件和第一期相同,并将现任公司高管柴永森(空调产品集团总裁).喻子达(执行副总裁.首席技术官)两位高管纳入股权激励计划.上半年公司各项业务稳定增长,冰箱

正邦科技圈钱不成转圈地高层内讧败退全产业链

10月16日,正邦科技(002157.SZ)公告披露,公司拟出资设立济南众和农牧发展公司,子公司同时出资设立孙公司新疆幸福加美养殖公司.而此时距公司正式终止配股的10月9日不过一个星期.自2010年来,正邦科技在资本市场频频"跑马圈钱":定向增发.公司债.配股,资本财技悉数上阵,直至此次配股终止,圈钱步伐才稍稍放缓.与之相应的是,公司在生猪产业链中下游的"跑马圈地"却从未止歇.不过,尽管从资本市场大量捞金,正邦科技的资金面却并无改观,资产负债率逐年大幅攀升.与此同时

际华集团公布网上申购中签号共57.85万个

全景网8月8日讯 际华集团(601718)周日晚间公布其首次公开发行股票网上定价发行摇号中签结果.中签号码如下: 末"2"位数:01 末"3"位数:307,432,557,682,807,932,182,057,336 末"4"位数:8372,6372,4372,2372,0372 末"5"位数:85480,65480,45480,25480,05480,82651,32651 末"6"位数:445514,

【SICP练习】126 练习3.57

练习3-57 原文 Exercise 3.57. How many additions are performed when we compute the nth Fibonacci number using the definition of fibs based on the add-streams procedure? Show that the number of additions would be exponentially greater if we had implemented