1

私はキューの演習を行おうとしていますが、特定のキューのエンキュー、デキュー、トップ、およびサイズ関数を作成することを意図しています。現在、デキュー機能で問題が発生しています。デキュー関数の望ましい結果を以下に示します。

(define q (make-queue))
(enqueue q 10)
(enqueue q 20)
(enqueue q 30)
(dequeue q)
10
(dequeue q)
20
(dequeue q)

私のコードは現在このようになっています

(module queue racket
  (provide make-queue enqueue dequeue top size) ;queue-tests)
  (struct queue (front back size) #:mutable #:transparent)

    (define (make-queue) (queue null null 0))

(define (enqueue q elt)
    (set-queue-size! q (+ (queue-size q) 1))
    (set-queue-back! q (cons elt (queue-back q)))
    )

(define (dequeue q)
    (cond  ((eq? (queue-size q) 0) null)
           ((null? (queue-front q))
           (begin
           (set-queue-front! q (cdr (reverse (queue-back q))))
           (set-queue-back! q null)
           (set-queue-size! q (- (queue-size q) 1))))
           (#t 
           (begin
           (set-queue-front! q (cdr (queue-front q)))
           (set-queue-size! q (- (queue-size q) 1))))))

  (define (top q)
    (cond ((eq? (queue-size q) 0) null)
          ((null? (queue-front q)) (last (queue-back q)))
          (#t (car (queue-front q)))))

  (define (size q)
    (queue-size q))

デキュー機能の何が問題になっていますか? 私はラケットにかなり慣れていないので、説明をいただければ幸いです。

4

2 に答える 2

1

あなたの質問は、あなたがやや海にいることを示唆しています。特に、プログラムを構成する部分を理解しているという感覚が得られません。エンキューおよびデキュー機能をテストするモジュールのテスト ケースを作成するように誘導すると思います。

私があなたの状況を誤解していたら、ごめんなさい!

于 2012-10-02T17:52:53.830 に答える
1

はるかに小さなテスト ケースを実行します。

(define q (make-queue))
(enqueue q "hi")
(dequeue q)

それ以上に、テスト ケースを単なるprintfステートメントとして扱わないでください。本当にやりたいことは、キューの状態が特定の時点である必要があるとわかっていることを書き出すことです。そして、これらの期待を実際のコードでcheck-equalで表現したいですか? . 各ステップの後にキューがどうあるべきかを書き出してから、check-equal を使用しますか? あなたの期待とコードが分岐している場所を正確にキャッチします。

それ以外の場合、テスト ケースは、クラッシュがないこと以外は実際には何も「テスト」していません。テスト ケースをもっと活用したい:動作をテストしてもらいたい。

テスト ケースの 2 つの例を次に示します。

(require rackunit)
;; ..  after your definitions
(let ()
   (define q (make-queue))
   (check-equal? q (queue null null 0)))

(let ()
   (define q (make-queue))
   (enqueue q 42)
   (check-equal? q (queue null '(42) 0)))

2 番目のテスト ケースで意図的な間違いを犯してしまったことに注意してください。キュー サイズがゼロであると誤って想定していることに注意してください。だからそれを修正してください。:)

デキューについても同じ種類のテストを行います。

その他の低レベルの詳細:

3番目のケースがわかりません。私はそこに他の人がいると思っていましたが、そうではないので、そこで何が起こっているのかわかりません。

condには暗黙のbeginが既に組み込まれているため、次のように指定することをお勧めします。

 (cond [<test>
        <body-1>
        <...>
        <body-n>] ...)

それ以外の:

(cond [<test>
       (begin
         <body-1>
         <...>
         <body-n>)] ...)
于 2012-10-02T19:04:47.783 に答える