<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)功心法啦
    主站蜘蛛池模板: 亚洲精品视频久久久| 日韩精品一区二区亚洲AV观看| 男人扒开添女人下部免费视频| 亚洲一级黄色视频| 91精品视频在线免费观看| 亚洲欧洲无卡二区视頻| 亚洲av无码成人精品区| 高清一区二区三区免费视频| 2017亚洲男人天堂一| 亚洲日韩中文在线精品第一| 一级毛片免费观看| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲av成人一区二区三区| 免费人成在线观看网站视频| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲欧美日韩久久精品| 久久亚洲中文字幕精品一区四 | 免费无码又爽又刺激一高潮| 亚洲一区二区三区高清不卡 | 久久精品国产亚洲| 啦啦啦www免费视频| 久久久99精品免费观看| 污网站在线观看免费| 亚洲国产中文在线视频| 伊人久久亚洲综合| 成年性羞羞视频免费观看无限| 中文在线观看国语高清免费| 亚洲综合激情五月丁香六月| 亚洲av中文无码乱人伦在线咪咕 | 久久久久久亚洲精品影院| 亚洲日韩欧洲无码av夜夜摸| 天天操夜夜操免费视频| 久久久免费精品re6| jizz免费一区二区三区| 99亚洲乱人伦aⅴ精品| 亚洲精品人成电影网| 国产亚洲精品无码专区| 日本特黄特黄刺激大片免费| 亚洲精品免费在线视频| 99久久国产精品免费一区二区 | 国产福利电影一区二区三区,亚洲国模精品一区 |