`
caoxudong818
  • 浏览: 45612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SICP练习——chap1(未完待续)

    博客分类:
  • sicp
 
阅读更多

习题答案已经搬到github

 

 

 

 

看这书相当费时间,习题慢慢做,边做边发吧。

 

 

 

练习1.1

10    12    8    3    6    19    false    4    20

 

练习1.2  将下面的表达式转换为前缀形式

练习1.2表达式

(/  (+  5  4  (-  2  (-  3  (+  6  (/  4  5)))))  (*  3  (-  6  2)  (-  2  7)))

 

练习1.3  定义一个过程,它以3个数为参数,返回其中较大的两个数之和

 

(define (largerSum a b c)
  (cond ((and (> a c) (> b c)) (+ a b))
        ((and (> a b) (> c b)) (+ a c))
        (else (+ b c))
        )
  )

 

练习1.4  描述下面的过程的行为

 

(define  (a-plus-abs-b  a  b)
    ((if  (>  b  0)  +  -)  a  b)
)

若b大于0,返回(a+b),否则返回(a-b)

 

练习1.5  下面的过程在正则序和应用序下有何不同

 

(define  (p)  (p))
(define  (test  x  y)
    (if  (=  x  0)
        0
        y
    )
)
(test  0  (p))

在正则序下,上面的过程会返回0,则应用序下会陷入无限循环

 

练习1.6  

这个自定义的过程在正则序和应用序下有不同的行为,在应用序下会陷入无限循环

 

练习1.7  给计算平方根的过程加上一个精度控制

 

(define (countSqrt x precision)
  (sqrt-loop x (nextGuess x 1.0) 1.0 precision)
  )

(define (sqrt-loop original guess lastGuess precision)
  (if (goodEnough guess lastGuess precision)
      guess
      (sqrt-loop original (nextGuess original guess) guess precision)
      )
  )

(define (goodEnough guess lastGuess precision)
  (< (/ (abs (- guess lastGuess)) lastGuess) precision)
  )
 
(define (nextGuess original y)
  (/ (+  original  y)  2)
  )
 

 

练习1.8  求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:

练习1.8

 

 

(define (countCubeRoot x precision)
  (countCubeRootLoop x (nextGuess x 1.0) 1.0 precision)
  )

(define (countCubeRootLoop original guess lastGuess precision)
  (if (goodEnough guess lastGuess precision)
      guess
      (countCubeRootLoop original (nextGuess original guess) guess precision)
      )
  )

(define (sqr y)
  (* y y)
  )

(define (goodEnough guess lastGuess precision)
  (< (/ (abs (- guess lastGuess)) lastGuess) precision)
  )
 
(define (nextGuess original y)
  (/ (+ (/ original (sqr y)) (* 2 y)) 3)
  )

 

 

练习1.9  下面几个过程各定义了一种加起两个正整数的方法,它们都是基于过程inc(将参数加1)和dec(将参数减1).

 

(define (+ a b)
    (if  (= a 0)
        b
        (inc (+ (dec a) b))
    )
)

(define (+ a b)
    (if (= a 0)
        b
        (+ (dec a) (inc b))
    )
)

 

 用代换模型展示这两个过程在求职(+ 4 5)时所产生的计算过程。

 

 

(define (+ a b)
    (if  (= a 0)
        b
        (inc (+ (dec a) b))
    )
)
(+ 4 5)
(inc (+ 3 5))
(inc (inc (+ 2 5)))
(inc (inc (inc (+ 1 5))))
(inc (inc (inc (inc (+ 0 5)))))
(inc (inc (inc (inc 5))))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9
递归计算过程


(define (+ a b)
    (if (= a 0)
        b
        (+ (dec a) (inc b))
    )
)
(+ 3 6)
(+ 2 7)
(+ 1 8)
(+ 0 9)
9
迭代计算过程

 

 

练习1.10  下面过程计算一个称为Ackermann函数的数学函数:

 

(define  (A  x  y)
    (cond  ((=  y  0)  0)
              ((=  x  0)  (*  2  y))
              ((=  y  1)  2)
              (else  (A  (-  x  1)  (A  x  (-  y  1))))
    )
)

 

下面的表达式的值是什么?

 

(A  1  10)
(A  2  4)
(A  3  3)

 

 请考虑下面的过程,其中的A就是上面定义的过程:

 

(define  (f  n)  (A  0  n))
(define  (g  n)  (A  1  n))
(define  (h  n)  (A  2  n))
(define  (k  n)  (*  5  n  n))

 请给出过程f、g和h对给定整数值n所计算的函数的数学定义。例如,(k  n)的计算是5(n^2)

(A 1 10) = 1024

(A 2 4) = 65536

(A 3 3) = 65536

 

 

(define  (f  n)  (A  0  n))
    (f n)
    (A 0 n)
    2n
 

 

(define  (g  n)  (A  1  n))
    (A (- 1 1) (A  1  (- n 1)))
    (A  0  (A  1 n-1))
    (A  0  (A  0  (A  1  n-2)))
    (A  0  (A  0  (A  0  ...  (A  1  1))))
    (A  0  (A  0  (A  0  ..  2)))    
    2^n
 

 

(define  (h  n)  (A  2  n))
    (A  (-  2  1)  (A  2  n-1))
    (A  1  (A  2  n-1))
    (A  (-  1  1)  (A  2  (A  2  n-1)))
    (A  0  (A  2  (A  2  n-1)))
    (*  2  (A  2  (A  2  n-1)))
    2^(2^(2^ (...2)))    (2的个数等于n)

 

练习1.11  函数f由如下的规则定义:如果n<3,那么f(n)=n;如果n>=3,那么f(n)=f(n-1)+2f(n-2)+3f(n-3)。请写一个采用递归计算过程计算f的过程,再写一个采用迭代计算过程计算f的过程。

递归计算过程

 

(define (f111 n)
    (if (< n 3)
        n
        (+ 
            (f111 (- n 1)) 
            (* 2 (f111 (- n 2)))
            (* 3 (f111 (- n 3)))
        )
    )
 ) 

迭代计算过程

 

(define (g  n)
  (define (g-iter a b c count)
    (if (> count n)
        a
        (g-iter (+ a
                   (* 2 b)
                   (* 3 c))
                a
                b
                (+ count 1))))
  (if (< n 3)
      n
      (g-iter 2 1 0 3)))
 

练习 1.12  帕斯卡三角形边界上的数都是1,内部的每个数是位于它上面的两个数之和。请写一个过程,采用递归计算过程计算出帕斯卡三角形

 

(define (pascal-triangle  row  col)
    (if  (or  
             (=  col  1) 
             (= col row)
         )
         1
         (+ 
             (pascal-triangle  (- row 1)  (- col 1) )
             (pascal-triangle  (- row 1)  col)
         )
    )
)
 

练习1.13  证明Fib(n)是最接近于n/5的整数,其中 = (1 + 5)/2。提示,  = (1 - 5)/2,使用归纳法和斐波纳契数列的定义证明Fib(n) = (n - n)/5。

 

    如提示所说,先证明Fib(n) = (n - n)/5。

    具体的证明方法略(并不难)。

    然后,为了了证明Fib(n)是最接近于n/5的整数,则需要证明(n/5 = n5 -  Fib(n)) < 0.5,此时原命题成立。

    事实上,虽然当n=1时,n/5的值约等于0.618033988(好神奇,黄金分割比例),但此时,n5约等于1.11803398,与之最近的整数是1,等于Fib(1),命题成立。

    当n>=2时,n/5<0.5,原命题仍然成立。

 

 

 

 

 

 

 

  • 大小: 1.6 KB
  • 大小: 756 Bytes
分享到:
评论

相关推荐

    sicp第二章练习题的解答

    在SICP中,练习2.5通常涉及到了过程定义、抽象和组合,可能需要读者理解并实现一种计算机制,如迭代或递归。 2. **chapter2.ss**: 这可能是整个第二章所有练习题的集合或者部分题目的解答。通过这个文件,读者可以...

    sicp:我的 SICP 练习

    《SICP:我的SICP练习》是关于Scheme编程语言和计算机程序设计原理的一份学习资料。SICP,全称《结构与解释程序》(Structure and Interpretation of Computer Programs),是由Harvard大学的Hal Abelson和MIT的...

    SICP 习题答案

    《计算机程序的构造和解释》(SICP)是一本极具影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman所著,MIT出版社出版。这本书以其深入探讨编程概念、程序设计方法以及计算机系统的工作原理而闻名。1-3...

    SICP习题解答,主要第一章的内容习题答案

    《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...

    sicp:我对SICP练习的回答

    《SICP:我对SICP练习的回答》 SICP,全称为《Structure and Interpretation of Computer Programs》,是一本由Harvard大学的Herman Tulleken和MIT的Gerald Jay Sussman、Guy L. Steele Jr.共同编著的经典计算机...

    sicp-solutions:SICP练习解决方案

    "sicp-solutions"是一个针对该书练习题的解答集,主要使用了Scheme语言,一个Lisp方言,而具体的实现环境是mit-scheme 9.2。 Scheme语言是Lisp家族的一员,以其简洁的语法和强大的函数式编程特性闻名。在"sicp-...

    sicp-clojure:在 Clojure 中解决的 SICP 练习

    "sicp-clojure" 项目则是将 SICP 的练习用 Clojure 语言进行了实现,为学习者提供了从不同角度理解和应用 Lisp 风格编程的良好资源。 在这个项目中,你可以找到一系列 Clojure 代码,它们对应于 SICP 教程中的各个...

    sicp:SICP练习的解决方案

    1. **函数式编程**:SICP的核心是函数式编程思想,强调使用纯函数(无副作用)和避免状态变化。函数式编程可以提高代码的可读性和可维护性,减少错误来源。 2. **递归**:递归是 Scheme 和函数式编程中的基本构造,...

    SICP-Solutions:我对 SICP 练习的回答

    《SICP解决方案:对SICP练习的回答》 该资源是关于《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,简称SICP)这本书的解答集,作者针对书中各章节的练习提供了详尽的解答,旨在...

    SICP:在 Scheme 中制定的 SICP 编程练习

    《SICP:在 Scheme 中制定的 SICP 编程练习》是针对计算机科学教育领域的一本经典教材——《结构与解释程序》(Structure and Interpretation of Computer Programs,简称 SICP) 的实践部分。SICP 由 Harold Abelson ...

    sicp in python 中文 sicp 中文

    sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download&gt;&gt;&gt;https://github.com/wizardforcel/sicp-py-zh

    sicp:我对 SICP 练习的解决方案(及其尝试)

    SICP - 笔记和练习我把它放在这里是因为有一天它可能会帮助某人。 练习是ex*文件。 章节中的注释和代码是ch文件。安装下载 Racket.app。 使用 DrRacket.app 或像这样启动 Racket repl: /Applications/Racket\ v...

    SICP.part1.rar

    SICP.part1.rar SICP.part1.rar SICP.part1.rar

    SICP中文第二版

    SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版

    sicp-Structure and Interpretation of Computer Programs

    ### SICP——《计算机程序的结构与解释》 #### 一、概述 《计算机程序的结构与解释》(Structure and Interpretation of Computer Programs, 简称SICP)是一本由MIT电气工程与计算机科学系教授Harold Abelson和...

    SICP_chapter_1-3:我对SICP第二版书内练习的解决方案,在线书中提供的示例作业集,麻省理工学院的6.001课程的项目和考试。 (所有这些仅适用于第1-3章。)

    在这个压缩包中,你将找到作者对第二版书中第1至3章练习题的解决方案,以及与麻省理工学院6.001课程相关的项目和考试题目。以下是这些章节中的核心知识点和学习重点: 1. **基础概念与Lisp语言**: - **Lisp语法**...

    sicp 2.2.4节图形语言

    《SICP 2.2.4 节:图形语言》是计算机科学经典教材《结构与解释程序》(Structure and Interpretation of Computer Programs)中的一个重要章节,它深入介绍了如何利用编程来创建图形,以及如何设计和理解复杂的计算...

    SICP(python中文带书签)

    《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...

    sicp-generators:为顽固的 SICP 人准备的测试练习段落 lein 插件生成器

    用法只需添加: :plugins [[lein-gen "0.2.1"]]到您的项目文件和生成器部分: :generators [[sicp-generators "0.1.0"]]然后使用以下内容创建测试/段落版本或测试/练习版本: lein generate exercise 1-1lein ...

Global site tag (gtag.js) - Google Analytics