1

押してみます!ベクター サイズを 2 倍にし、古いスタック要素をコピーすることにより、フル スタックにします。ただし、私のコードは現在無限ループで実行されています。私は何を間違っていますか?

(define push!
    (lambda (ra-stack item)
      (if (<= (vector-length (cells ra-stack))
              (height ra-stack))
          (begin (display "Enlarging stack...")
                 (enlarge-stack! ra-stack)
                 (push! ra-stack item))
          (begin (vector-set! (cells ra-stack) (height ra-stack) item) 
                 (set-height! ra-stack (+ (height ra-stack) 1)) ra-stack))))

  (define enlarge-stack!
    (lambda (ra-stack)
      (let ((cells-length (vector-length (cells ra-stack))))
        (make-vector (* 2 cells-length)))))

以下のコードはすべて正しく動作します。

(define set-height! 
    (lambda (ra-stack new-height)
      (vector-set! ra-stack 0 new-height)))

(define cells  
    (lambda (ra-stack)
      (vector-ref ra-stack 1)))

(define height
    (lambda (ra-stack)
      (vector-ref ra-stack 0)))

(define set-cells!  
    (lambda (ra-stack new-cells)
      (vector-set! ra-stack 1 new-cells)))

ありがとうございました!

4

1 に答える 1

1

あなたenlarge-stack!はその引数にまったく影響を与えません。set-cells!セルを新しい拡大ベクトルに変換しません。また、要素を古いベクターから新しいベクターにコピーしようともしません。

あなたが現在持っているものは、より適切に と呼ばれenlarged-stack-cellsます。つまり、古い値のコピーを受け取る準備ができている、新しい拡大された空のベクトルを返します。

(define enlarged-stack-cells
    (lambda (ra-stack)
      (let ((cells-length (vector-length (cells ra-stack))))
        (make-vector (* 2 cells-length)))))     ; returns the new vector

(define enlarge-stack!
    (lambda (ra-stack)
      (let ((cs (enlarged-stack-cells ra-stack)))
        (begin
          (copy-cells! cs (cells ra-stack))     ; write it
          (set-cells! ra-stack cs)))))

書いてください:

(define copy-cells!
    (lambda (newcells oldcells)
      (let ((cells-length (vector-length oldcells)))
         ....
于 2013-11-14T08:02:17.800 に答える