<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的下一個節點),最后剩下的節點的編號就是答案。
    主站蜘蛛池模板: 国产亚洲精品免费| 亚洲欧美日韩中文高清www777| 91在线亚洲精品专区| 国产精品二区三区免费播放心| 十八禁无码免费网站| 久久国产精品免费一区二区三区 | 你懂的在线免费观看| 日韩色日韩视频亚洲网站| 亚洲国产成+人+综合| 亚洲国产精品人久久| 久久久久无码专区亚洲av | 日韩一级片免费观看| 亚洲一区二区三区在线观看网站| 色噜噜综合亚洲av中文无码| 中文字幕久久亚洲一区| 免费吃奶摸下激烈视频| 日本免费福利视频| 24小时日本在线www免费的| 91视频国产免费| 国产乱子精品免费视观看片| 久久不见久久见免费视频7| 国产一精品一AV一免费| 野花香高清在线观看视频播放免费| 久久www免费人成精品香蕉| 一个人免费播放在线视频看片| 羞羞漫画在线成人漫画阅读免费| 久久亚洲精品11p| 国产精品亚洲专区无码唯爱网| 亚洲国产精华液2020| 亚洲乱妇老熟女爽到高潮的片| 狠狠色香婷婷久久亚洲精品| 久久精品亚洲AV久久久无码| 亚洲午夜精品一区二区公牛电影院| 亚洲第一成年人网站| 亚洲国产成人久久综合一区| 亚洲成av人片不卡无码| 亚洲一区中文字幕在线电影网 | 久久国产精品免费专区| 日韩av无码久久精品免费| 久久A级毛片免费观看| 青娱分类视频精品免费2|