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

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

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

    莊周夢蝶

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

    scheme解決約瑟夫環問題(續)

    Posted on 2008-04-16 10:27 dennis 閱讀(626) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎
        sicp的習題3.22,也就是以消息傳遞的風格重新實現隊列,我的解答如下:

    (define (make-queue)
      (let ((front
    -ptr '())
            (rear-ptr '()))
      (define (set-front-ptr! ptr) (set! front-ptr ptr))
      (define (set
    -rear-ptr! ptr) (set! rear-ptr ptr))
      (define (empty
    -queue?) (null? front-ptr))
      (define (front
    -queue)
        (
    if (empty-queue?)
            (error 
    "FRONT called with an empty queue")
            (car front
    -ptr)))
      (define (insert
    -queue! item)
        (let ((new
    -pair (cons item '())))
          (cond ((empty-queue?)
                  (set
    -front-ptr! new-pair)
                  (set
    -rear-ptr! new-pair))
                (
    else
                   (set
    -cdr! rear-ptr new-pair)
                   (set
    -rear-ptr! new-pair)))))
      (define (delete
    -queue!)
          (cond ((empty
    -queue?)
                 (error 
    "DELETE! called with an empty queue" queue))
                (
    else
                   (set
    -front-ptr! (cdr front-ptr)))))
      (define (dispatch m)
        (cond ((eq? m 
    'front-queue) (front-queue))
              ((eq? m 'empty-queue?) (empty-queue?))
              ((eq? m 'insert-queue!) insert-queue!)
              ((eq? m 'delete-queue!) delete-queue!)
              (else
                 (error 
    "Unknow method" m))))
        dispatch))
    (define (front
    -queue z) (z 'front-queue))
    (define (empty-queue? z) (z 'empty-queue?))
    (define (insert-queue! z item) ((z 'insert-queue!) item))
    (define (delete-queue! z) ((z 'delete-queue!)))
       
        由此,我才知道自己竟然一直沒有想到,scheme完全可以模擬單向循環鏈表,整整第三章都在講引入賦值帶來的影響,而我卻視而不見。在引入了改變函數后,數據對象已經具有OO的性質,模擬鏈表、隊列、table都變的易如反掌。首先,模擬節點對象,節點是一個序對,包括當前節點編號和下一個節點:
    (define (make-node n next) (cons n next))
    (define (set
    -next-node! node next) (set-cdr! node next))
    (define (set
    -node-number! node n) (set-car! node n))
    (define (get
    -number node) (car node))
    (define (get
    -next-node node) (cdr node))

        有了節點,實現了下單向循環鏈表:
    (define (make-cycle-list n)
      (let ((head (make
    -node 1 '())))
        (define (make-list current i)
          (let ((next
    -node (make-node (+ i 1'())))
            (cond ((= i n) current)
                  (
    else
                    (set
    -next-node! current next-node)
                    (make
    -list next-node (+ i 1))))))
        (set
    -next-node! (make-list head 1) head) 
        head))

        make-cycle-list生成一個有N個元素的環形鏈表,比如(make-cycle-list 8)的結果如下
    #0=(1 2 3 4 5 6 7 8 . #0#)
        Drscheme形象地展示了這是一個循環的鏈表。那么約瑟夫環的問題就簡單了:
    (define (josephus-cycle n m)
      (let ((head (make
    -cycle-list n)))
        (define (josephus
    -iter prev current i)
          (let ((next
    -node (get-next-node current)))
           (cond ((eq? next
    -node current) (get-number current))
                 ((
    = 1 i)
                  (set
    -next-node! prev next-node)
                  (josephus
    -iter prev next-node m))
                 (
    else
                   (josephus
    -iter current next-node (- i 1))))))
        (josephus
    -iter head head m)))

        從head節點開始計數,每到m,就將當前節點刪除(通過將前一個節點的next-node設置為current的下一個節點),最后剩下的節點的編號就是答案。
    主站蜘蛛池模板: 亚洲av日韩综合一区二区三区| 久久笫一福利免费导航| 7777久久亚洲中文字幕| 亚洲AV无码一区东京热| 亚洲精品一级无码鲁丝片| 麻豆成人精品国产免费| 黄色成人免费网站| 免费不卡在线观看AV| 你懂得的在线观看免费视频| 高潮毛片无遮挡高清免费视频| 亚洲日韩亚洲另类激情文学| 亚洲小说区图片区| 亚洲综合精品香蕉久久网97| 日本亚洲成高清一区二区三区| 国产精品亚洲mnbav网站 | 免费国产人做人视频在线观看| 久久这里只有精品国产免费10| 67pao强力打造国产免费| 久久九九全国免费| 成人免费区一区二区三区| 国产精品免费αv视频| 四虎国产精品永免费| 色吊丝性永久免费看码| 青草青草视频2免费观看| 亚洲欧美国产精品专区久久| 亚洲综合色婷婷在线观看| 亚洲精品伊人久久久久| 亚洲一区二区三区在线网站| 亚洲精品亚洲人成在线麻豆| 亚洲黄色高清视频| 亚洲欧洲日产专区| 久久亚洲最大成人网4438 | 四虎在线免费播放| 免费理论片51人人看电影| 好吊妞788免费视频播放| 爽爽日本在线视频免费| 亚洲av日韩片在线观看| 亚洲精品无码久久不卡| 亚洲综合精品香蕉久久网| 国产成人无码综合亚洲日韩| 日韩精品亚洲人成在线观看|