<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成人无码软件 | 波多野结衣免费一区视频| 亚洲国产一区视频| 精品在线观看免费| 亚洲日韩国产精品乱| 国产免费伦精品一区二区三区| 又黄又大又爽免费视频| 特级毛片免费播放| 亚洲精品国产精品乱码不卡 | 国产午夜精品理论片免费观看| 国产精品免费_区二区三区观看 | 亚洲成年网站在线观看| 日韩成人免费aa在线看| 国产精品久久亚洲一区二区| 亚洲国产婷婷香蕉久久久久久| 成人无码区免费A∨直播| 亚洲人成网77777亚洲色| 日本免费人成视频在线观看| 亚洲制服在线观看| 国产色爽女小说免费看| 一级毛片在播放免费| 亚洲AV乱码一区二区三区林ゆな| 中文字幕成人免费视频| 亚洲高清一区二区三区| 一级毛片直播亚洲| 中文成人久久久久影院免费观看| 亚洲国产精品第一区二区 | 国产乱子伦精品免费无码专区| 美女视频黄频a免费观看| 亚洲一区AV无码少妇电影☆| 99re在线视频免费观看| 亚洲AV无码成人精品区日韩| 亚洲性猛交XXXX| 99久久免费国产精品特黄 | 久久99精品免费视频| 日韩亚洲不卡在线视频中文字幕在线观看 | 国产成人青青热久免费精品| 中文字幕免费在线看线人动作大片| 亚洲电影一区二区三区|