<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的下一個節點),最后剩下的節點的編號就是答案。
    主站蜘蛛池模板: 免费一级做a爰片性色毛片| 性做久久久久久免费观看| 亚洲成a人一区二区三区| 亚洲色大成网站www尤物| 毛片网站免费在线观看| 一区二区亚洲精品精华液| 24小时免费直播在线观看| 亚洲美国产亚洲AV| 国产免费啪嗒啪嗒视频看看 | 亚洲精品国产第1页| 18pao国产成视频永久免费| 亚洲欧洲国产综合| 无码人妻一区二区三区免费| 亚洲色大成网站www尤物| 日批日出水久久亚洲精品tv| 精品国产污污免费网站入口在线| 国产亚洲成av片在线观看| 18以下岁毛片在免费播放| 亚洲午夜精品久久久久久app | 美女视频黄的全免费视频| 亚洲熟妇少妇任你躁在线观看| 国产jizzjizz免费看jizz| 99免费精品视频| 亚洲成综合人影院在院播放| 日本久久久免费高清| xxxx日本在线播放免费不卡| 亚洲成a人片在线观看无码专区| 在线免费中文字幕| 久久精品国产亚洲av品善| 国产亚洲精品国看不卡| 四虎精品视频在线永久免费观看| 伊人久久亚洲综合影院首页| 亚洲色一色噜一噜噜噜| 99久久99久久免费精品小说| 亚洲精品人成网线在线播放va | 亚洲精品视频在线看| 一级毛片在线观看免费| 亚洲a∨无码一区二区| 国产成人A人亚洲精品无码| 中文字幕无码成人免费视频| 一级毛片无遮挡免费全部|