sicp 5.1节习题尝试解答

5.1 图就不画在机器上了,麻烦

5.2 用寄存器语言描述5.1题中的阶乘机器,加上了读取和打印,这里的解答全部在实际的寄存机器中验证过,但是仍然按照该节的表示法表示。

(controller
  fac-loop
   (assign n (op read))
   (assign product (const 1))
   (assign counter (const 1))
  iter-loop
   (test (op >) (reg counter) (reg n))
   (branch (label iter-done))
   (assign product (op *) (reg product) (reg counter))
   (assign counter (op +) (reg counter) (const 1))
   (goto (label iter-loop))
  iter-done
   (perform (op print) (reg product))
   (goto (label fac-loop)))

 
5.3 牛顿法求平方根,将这个过程转化为寄存器语言,第一个版本,假设good-enough?和improve都是基本过程,

;version1
(controller
   sqrt-loop
    (test (op good-enough?) (reg guess))
    (branch (label sqrt-done))
    (assign guess (op improve) (reg guess))
    (goto (label good-enough))
   sqrt-done)

  第二个版本,展开good-enough?过程,

;version2
(controller
   good-enough
    (assign t (op square) (reg guess))
    (assign t (op -) (reg t) (reg x))
    (assign t (op abs) (reg t))
    (test (op <) (reg t) (const 0.001))
    (branch (label sqrt-done))
    (assign guess (op improve) (reg guess))
    (goto (label good-enough))
   sqrt-done)

  最后,展开improve过程,

;version3
(controller
  sqrt-init
   (assign guess (const 1.0))
   (assign x (op read))
  good-enough
    ;good-enough
   (assign t (op square) (reg guess))
   (assign t (op -) (reg t) (reg x))
   (assign t (op abs) (reg t))
   (test (op <) (reg t) (const 0.001))
   (branch (label sqrt-done))
    ;improve
   (assign t (op /) (reg x) (reg guess))
   (assign t (op +) (reg guess) (reg t))
   (assign guess (op /) (reg t) (const 2.0))
   (goto (label good-enough))
  sqrt-done)

   在start之后,从寄存器guess中得到最后结果。

5.4
a)第一个是一个指数计算过程,用到了递归,因此需要引入continue寄存器来保存和恢复堆栈,实现与阶乘相似,如下

(controller
    (assign continue (label expt-done))
    expt-loop
      (test (op =) (reg n) (const 0))
      (branch (label expt-base-case))
      ;;保存continue
      (save continue)
      (assign n (op -) (reg n) (const 1))
      (assign continue (label after-expt))
      (goto (label expt-loop))
    after-expt
      ;;恢复continue
      (restore continue)
      (assign val (op *) (reg b) (reg val))
      (goto (reg continue))
    expt-base-case
      (assign val (const 1))
      (goto (reg continue))
    expt-done
      (perform (op display) (reg val)))

b) 迭代型的递归计算过程,尾递归调用,因此不需要continue寄存器来保存和恢复堆栈,这道习题就是希望能分辨非尾递归和尾递归带来的寄存机器语言的区别

(controller
    (assign product (const 1))
    (assign n (op read))
    (assign b (op read))
    (assign counter (reg n))
   expt-iter-loop
     (test (op =) (reg counter) (const 0))
     (branch (label expt-done))
     (assign counter (op -) (reg counter) (const 1))
     (assign product (op *) (reg b) (reg product))
     (goto (label expt-iter-loop))
   expt-done
      (perform (op display) (reg product)))

5.5  手工模拟就算了,5.2节就可以机器模拟了

5.6 是有一个多余的save和一个多余的restore操作,请看注释:

(
   (assign continue (label fib-done))
  fib-loop
   (test (op <) (reg n) (const 2))
   (branch (label immediate-answer))
   ;;compute fib(n-1)
   (save continue)
   (assign continue (label after-fib-1))
   (save n)
   (assign n (op -) (reg n) (const 1))
   (goto (label fib-loop))
  after-fib-1 
   ;;compute fib(n-2)
   (restore n)
   ;这里多余,(restore continue)
   (assign n (op -) (reg n) (const 2))
   ;这里多余,(save continue)
   (assign continue (label after-fib-2))
   (save val) ;;save fib(n-1)
   (goto (label fib-loop))
  after-fib-2
   (assign n (reg val))
   (restore val)
   (restore continue)
   (assign val (op +) (reg val) (reg n))
   (goto (reg continue))
 immediate-answer
   (assign val (reg n))
   (goto (reg continue))
   
 fib-done)

文章转自庄周梦蝶  ,原文发布时间2009-06-11

时间: 2024-09-20 05:36:22

sicp 5.1节习题尝试解答的相关文章

sicp 2.3小结习题尝试解答

 习题2.2没有全部做,我读书的速度远远超过做习题的进度,没办法,时间有限,晚上的时间基本用来看书了,习题也都是在工作间隙做的,慢慢来了,前两章读完再总结下.回到2.3节,这一节在前几节介绍数值型符号数据的基础上引入了符号数据,将任意符号作为数据的能力非常有趣,并给出了一个符号求导的例子,实在是太漂亮了. 习题2.53,直接看结果: > (list 'a 'b 'c)(a b c)> (list (list 'george))((george))> (cdr '((x1 x2) (y1 

sicp 3.1.1小节习题尝试解答

这一节主要是介绍局部状态变量,介绍了set!和begin的语法,看来ruby使用!号来表示改变变量值不是什么新鲜主意.    习题3.1,不解释了 ;习题3.1 (define (make-accumulator init)   (define (accumulator num)     (set! init (+ init num))     init)   accumulator) 习题3.2,非常有趣的例子,在内部维持一个计数的变量即可,如果传入的参数是特定的符号就返回计数或者清0,如果不

sicp3.5.2、3.5.3节部分习题尝试解答

   本节主要讲述无穷流. 3.53,显然 (define s (cons-stream 1 (add-stream s s))) 定义是2的n次方组成的无穷数列,2,4,8,16,32... 3.54,定义阶乘组成的无穷序列: (define (mul-streams s1 s2)   (stream-map * s1 s2)) (define factorials (cons-stream 1 (mul-streams factorials (stream-cdr integers))))

sicp4.1.1-4.1.5节部分习题尝试解答(update)

    当将用scheme写的scheme求值器跑起来的时候,你不觉的兴奋是不可能的,真的太酷了,太magic了. 习题4.2,如果将application?判断放在define?判断之前,那么求值(define x 3)将把define当作一般的procedure应用于参数x和3,可是define是特殊的语法形式,而非一般过程,导致出错. 习题4.4,我的解答,eval增加两个判断:  ((and? exp)    (eval-and (and-exps exp) env))  ((or? e

《网站设计 开发 维护 推广 从入门到精通》——2.5 经典习题与解答

2.5 经典习题与解答 1.填空题(1)自然界中色彩五颜六色.千变万化,但是最基本的只有三种(红.黄.蓝),其他的色彩都可以由这三种色彩调和而成,这三种色彩称为 . (2)现实生活中的色彩可以分为彩色和非彩色.其中黑白灰属于 系列,其他的色彩都属于 . 2.简答题简要说出网页色彩搭配的一些原理.

《网站设计 开发 维护 推广 从入门到精通》—— 2.5 经典习题与解答

2.5 经典习题与解答 1.填空题(1)自然界中色彩五颜六色.千变万化,但是最基本的只有三种(红.黄.蓝),其他的色彩都可以由这三种色彩调和而成,这三种色彩称为 . (2)现实生活中的色彩可以分为彩色和非彩色.其中黑白灰属于 系列,其他的色彩都属于 . 2.简答题简要说出网页色彩搭配的一些原理.

《网站设计 开发 维护 推广 从入门到精通》——1.7 经典习题与解答

1.7 经典习题与解答 1.填空题(1) . 和 这三款软件相辅相成,是制作网页的首选工具,其中 主要用来制作网页文件,制作出来的网页兼容性好.制作效率也很高: 用来制作精美的网页动画: 用来处理网页中的图形. (2)网站就是把一个个网页系统地链接起来的集合,如新浪.搜狐和网易等.网站按其内容的不同可分为 . . . 和 等. 2.简答题简述网页版面布局的原则.

《网站设计 开发 维护 推广 从入门到精通》—— 1.7 经典习题与解答

1.7 经典习题与解答 1.填空题(1) . 和 这三款软件相辅相成,是制作网页的首选工具,其中 主要用来制作网页文件,制作出来的网页兼容性好.制作效率也很高: 用来制作精美的网页动画: 用来处理网页中的图形. (2)网站就是把一个个网页系统地链接起来的集合,如新浪.搜狐和网易等.网站按其内容的不同可分为 . . . . 和 等. 2.简答题简述网页版面布局的原则.

[家里蹲大学数学杂志]第328期詹兴致矩阵论习题参考解答

说明:  1. 大部分是自己做的, 少部分是参考文献做的, 还有几个直接给出参考文献. 2. 如果您有啥好的想法, 好的解答, 热切地欢迎您告知我, 或者在相应的习题解答网页上回复. 哪里有错误, 也盼望您指出. 3. 毕竟大学时学过高等代数, 想多学点矩阵论的东西 (matrix=magic), 就先选这本书看看了.    目录          序言 第一章 预备知识 第二章 张量积与复合矩阵 第三章 Hermite 矩阵与优超关系 第四章 奇异值和酉不变范数 第五章 矩阵扰动 第六章 非负