zoukankan      html  css  js  c++  java
  • 【SICP练习】23 练习1.29

    

    练习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=100n=1000来测试所写的函数是否正确。

    (simpson-ruler cube 0 1 100)

    ;Value: .24999999999999992

    (simpson-ruler cube 0 1 1000)

    ;Value: .2500000000000003

    通过和书中的integral对比,辛普森规则很明显要精确得多。

    版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

  • 相关阅读:
    ionic环境搭建
    C# Enum Type
    【IOS】3. OC 类声明和实现
    【IOS】2.基础
    【IOS】1.学前准备
    win8, VS2013 .NET 4.5在哪找svcutil.exe?
    【你吐吧c#每日学习】11.10 C# Data Type conversion
    【你吐吧c#每日学习】10.30 C#Nullable Types
    【你吐吧c#每日学习】10.29 C#字符串类型&Common operators
    给三个int,判断是否可构成三角形算法
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786207.html
Copyright © 2011-2022 走看看