3

Scheme で LIFO リストを実装するのに問題があります。1 つの要素のみをスタックにプッシュしたいが、複数の要素をプッシュできるようにしたい場合、私のコードは問題なく動作します。これが私のコードです:

(define (make-stack)
(let ((stack '()))
    (lambda (msg . args)
      (cond ((eq? msg 'pop!)
             (set! stack (cdr stack)))
            ((eq? msg 'push!) 
             (if (= 1 (length args))
                 (set! stack (cons args stack))
                 (push stack args)))
            ((eq? msg 'stack) stack)
            (else "Not valid message!")))))
(define (push stack args)
  (if (null? args)
      stack
      (set! stack (cons (car args) stack)))
  (push stack (cdr args)))

これは私の最後の試みです。数えきれないほど多くのアプローチを試みました。「args」から要素を取得して、スタックに 1 つずつ追加する方法がわかりません。「プッシュ」手順はまったく機能しません。最後の行でエラーが発生するだけです (おそらく再帰が間違っています)。私が言ったように、これは私の最後の試みです。

編集:

push!、pop! を実装しようとしました。スタック オブジェクトを引数として取る独立したプロシージャとしてスタックします。ポップ!そしてプッシュ!簡単でしたが、プッシュでした!追加したい要素は、プッシュのリスト内に既にネストされています! そのため、それを make-stack プロシージャに送信すると、ネストされたリストとして表示されます。これを修正するために再帰的な手順を作成しようとしました:

(define (push! lifo . args)
   (if (null? args)
        lifo
        (lifo 'push! (car args))
   (push! lifo (cdr args))

これはループに入るだけで、理由がわかりません...(再帰は私にとって大きな問題です)

4

1 に答える 1