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

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

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

    莊周夢蝶

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

    sicp 習題3.6-3.8試解

    Posted on 2007-08-01 15:45 dennis 閱讀(402) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎
    習題3.6,我的實現如下:
    (define rand
      (let ((x 3))
         (lambda(arg)
          (cond((eq? arg 'generate)
                ((lambda()(set! x (rand-update x)) x)))
               ((eq? arg 'reset)
                (lambda(init) (set! x init) (set! x (rand-update x)) x))
               (else
                 error "Unkonown OP")))))
    簡單解釋下,當參數是generate時,直接調用匿名lambda函數(lambda()(set! x (rand-update x)) x) ,最后返回隨機值。而當第一個參數是reset時,返回匿名函數(lambda(init) (set! x init) (set! x (rand-update x)) x),這個匿名函數接受一個新的初始值,并賦值給x,然后調用rand-update

    習題3.7,引入賦值的代價就是引入了副作用以及相應的復雜性,3.3小節提出了命令式語言與函數式語言的基本差別。這一題,首先修改習題3.3(參見《sicp 3.1小結習題嘗試解答》),增加一個檢查密碼是否正確的功能,用以檢查輸入的原始帳戶密碼是否正確,make-account修改一下
    ;習題3.3
    (define (make-account2 balance passwd)
      (define (checkpwd pwd)
        (eq? pwd passwd))
      (define (withdraw amount)
        (if (>= balance amount)
            (begin (set! balance (- balance amount)) balance)
            "余額不足"))
      (define (deposit amount)
        (set! balance (+ balance amount))
        balance)
      (define (dispatch pwd m)
        (if (eq? pwd passwd)
            (cond ((eq? m 'withdraw) withdraw)
                  ((eq? m 'deposit) deposit)
                  ((eq? m 'checkpwd) checkpwd)
                (else
                   (error "Unknow request--MAKE-ACCOUNT" m)))
            (lambda(x) "Incorrect password")))
            
      dispatch)

    那么,make-joint可以寫為:
    (define (make-joint account-name account-pass new-pass)
      (if (account-name 'checkpwd account-pass)
          (lambda (passwd m)
          (if (eq? new-pass passwd)
              (account-name account-pass m)
               (error "Incorrect password")))
          (error
             "Incorrect password to the original account")))

    首先是檢查原始帳戶的密碼是否正確,正確返回匿名函數(兩個參數passwd m),此匿名函數檢查密碼以及調用原始帳戶操作;如果不正確就提示消息。
    測試一下:
    > (define dennis-acc (make-account2 100 '123))
    > (define zane-acc (make-joint dennis-acc '123 'abc))
    > ((dennis-acc '123 'withdraw) 10)
    90
    >  ((zane-acc 'abc 'withdraw) 10)
    80


    習題3.8,這一題比較簡單了,在內部維持一個狀態變量即可
    (define f
      (let ((y 1))
        (lambda(x) (set! y (* x y)) y)))
    測試可知,在(f 1) (f 0)執行的順序不同時,返回的值不同。


    主站蜘蛛池模板: 中文字幕乱码亚洲精品一区| 久久精品亚洲日本佐佐木明希| 亚洲妓女综合网99| 无码精品一区二区三区免费视频| 中文字幕在亚洲第一在线| 亚洲毛片在线免费观看| 色噜噜综合亚洲av中文无码| 无码一区二区三区免费| 久久久亚洲欧洲日产国码aⅴ | 亚洲午夜无码毛片av久久京东热 | 羞羞视频在线免费观看| 亚洲电影日韩精品 | 久久久久国产成人精品亚洲午夜 | 日本亚洲中午字幕乱码| 免费在线观看黄网| 黄床大片免费30分钟国产精品| 亚洲熟妇无码八AV在线播放| 久久99精品国产免费观看| 亚洲一欧洲中文字幕在线| 国产禁女女网站免费看| eeuss草民免费| 亚洲无删减国产精品一区| 午夜免费1000部| 亚洲精品久久无码av片俺去也 | 又粗又长又爽又长黄免费视频 | 国产亚洲精品xxx| 国产卡一卡二卡三免费入口| 亚洲国产精品自在自线观看| 亚洲日本中文字幕天堂网| 日本黄色动图免费在线观看| 亚洲av永久无码精品天堂久久| 看全色黄大色大片免费久久| 国产福利免费视频| 亚洲成人午夜电影| 亚洲国产精品毛片av不卡在线 | 在线A亚洲老鸭窝天堂| 2022久久国产精品免费热麻豆| 亚洲国产无线乱码在线观看| 亚洲午夜未满十八勿入网站2| 亚洲免费综合色在线视频| 精品国产呦系列在线观看免费|