<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    5.1 圖就不畫在機器上了,麻煩

    5.2 用寄存器語言描述5.1題中的階乘機器,加上了讀取和打印,這里的解答全部在實際的寄存機器中驗證過,但是仍然按照該節(jié)的表示法表示。

    (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 牛頓法求平方根,將這個過程轉(zhuǎn)化為寄存器語言,第一個版本,假設(shè)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中得到最后結(jié)果。

    5.4
    a)第一個是一個指數(shù)計算過程,用到了遞歸,因此需要引入continue寄存器來保存和恢復(fù)堆棧,實現(xiàn)與階乘相似,如下

    (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
          ;;恢復(fù)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) 迭代型的遞歸計算過程,尾遞歸調(diào)用,因此不需要continue寄存器來保存和恢復(fù)堆棧,這道習(xí)題就是希望能分辨非尾遞歸和尾遞歸帶來的寄存機器語言的區(qū)別
    (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節(jié)就可以機器模擬了

    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)



      




    評論

    # re: sicp 5.1節(jié)習(xí)題嘗試解答  回復(fù)  更多評論   

    2009-06-11 09:55 by Arbow
    老莊又在苦練內(nèi)功心法啦
    主站蜘蛛池模板: 二区久久国产乱子伦免费精品| 视频免费在线观看| 亚洲国产天堂久久久久久| baoyu777永久免费视频| 亚洲一级毛片在线观| 亚洲精品成人区在线观看| 免费女人高潮流视频在线观看| 亚洲精品无码永久在线观看男男| 国产成人亚洲综合| 亚洲免费网站观看视频| 精品一区二区三区免费观看| 亚洲国产福利精品一区二区| 亚洲精品国产精品乱码不卡| 亚洲免费观看在线视频| 九九久久精品国产免费看小说| 亚洲成人黄色在线| 亚洲午夜激情视频| 日韩精品成人无码专区免费| 天黑黑影院在线观看视频高清免费| 亚洲高清中文字幕免费| 亚洲精品无码成人片久久 | 妞干网免费视频在线观看| free哆拍拍免费永久视频| 亚洲人成在久久综合网站| 久久久亚洲精品蜜桃臀| 最新中文字幕免费视频| 久久免费观看国产精品| 牛牛在线精品免费视频观看| 亚洲视频一区二区在线观看| 亚洲人成无码网站久久99热国产| 国产日本一线在线观看免费| 国产午夜精品久久久久免费视| 日韩精品亚洲专区在线影视| 亚洲黄色激情视频| 亚洲欧洲国产日韩精品| 亚洲婷婷国产精品电影人久久| 国产色爽免费视频| 一二三四免费观看在线电影| 8x网站免费入口在线观看| 你好老叔电影观看免费| 一级毛片免费观看不收费|