【SICP练习】23 练习1.29
来源:互联网 发布:淘宝收不到卖家消息 编辑:程序博客网 时间:2024/06/06 00:40
练习1.29
这道题的数学气息比较浓厚。像变量h和函数y在书中已经有了定义,并且n是偶数。另外通过观察我们发现当k等于0或者n时,y的系数为1;当k为偶数时,y的系数为2;当k为奇数时(在函数中直接用else也可以),y的系数为4。根据书中前面的讲解,需要有一个term作用在a上,还要有一个next来产生下一个a值。下面我们依次来完成这5个部分。
(define h (/ (- b a) n))
我曾将这一部分拿来编译过,但报错说n未定义。由此可见采用应用序取值的Lisp在采用应用序的同时还是从后往前求值的。不信的话,可以将n拿来define定义一下,会继续报错说a未定义而不是所b。好了我们再继续写后面的内容:
(define (y k) (f (+ a (* k h))))
(define (factor k)
(cond((or (= k 0) (= k n)) 1)
((even? k) 2)
(else4)))
(define (term k) (* (factor k) (y k)))
(define (next k) (+ k 1))
前文已经说了n是偶数,因此在调用simpson-ruler函数前应该先判断n的正负性:当n为奇数时报错,n为偶数时则计算并返回积分值。
(define (simpson-ruler f a b n)
(define h (/ (- b a) n))
(define (y k) (f (+ a (* k h))))
(define (factor k)
(cond ((or (= k 0) (= k n)) 1)
((even? k) 2)
(else4)))
(define (term k) (* (factor k) (y k)))
(define (next k) (+ k 1))
(if (odd? n)
(error “Error: You just input an odd number.”)
(* (/h 3) (sum term (exact->inexact 0) next n))))
exact->inexact在【Scheme归纳】2中有介绍,其用来把分数转换为浮点数。
函数sum和函数cube我们可以直接copy书中的代码。下面我们按照题目中的要求将n=100和n=1000来测试所写的函数是否正确。
(simpson-ruler cube 0 1 100)
;Value: .24999999999999992
(simpson-ruler cube 0 1 1000)
;Value: .2500000000000003
通过和书中的integral对比,辛普森规则很明显要精确得多。
- 【SICP练习】23 练习1.29
- 【SICP练习】2 练习1.6
- 【SICP练习】3 练习1.7
- 【SICP练习】4 练习1.8
- 【SICP练习】5 练习1.9
- 【SICP练习】6 练习1.10
- 【SICP练习】7 练习1.11
- 【SICP练习】8 练习1.12
- 【SICP练习】9 练习1.15
- 【SICP练习】10 练习1.16
- 【SICP练习】11 练习1.17
- 【SICP练习】12 练习1.18
- 【SICP练习】13 练习1.19
- 【SICP练习】14 练习1.20
- 【SICP练习】15 练习1.21
- 【SICP练习】16 练习1.22
- 【SICP练习】17 练习1.23
- 【SICP练习】18 练习1.24
- 【SICP练习】22 练习1.28
- C# 流操作
- C语言中 extern "C"使用
- 初探SQLMAP
- C++拾遗--lambda表达式
- 【SICP练习】23 练习1.29
- 升级到VMWARE11后,vmcore/vmm/main/physMem_monitor.c:1123错误解决
- Git使用手册:创建一个Git仓库
- Action接收参数的3种方式(属性,域模型,模型驱动,struts2.1.8)
- c++ primer
- Android中的windowSoftInputMode属性详解
- 去百度API的百度地图准确叠加和坐标转换的解决方案研究
- 【SICP练习】24 练习1.30
- java 获得用户访问的真实IP地址