2

我正在学习球拍和函数式编程的新手,并为堆栈编写了以下代码:

(define stack '(0))

(define (push x stack)
  (set! stack (cons x stack)))

(define (pop stack)
  (let ((result (car stack)))
    (set! stack (cdr stack))
     result))

当我做

(push 2 stack)

没有错误。当我这样做时,(pop stack)我会返回 0。我做错了什么。

4

3 回答 3

2

您有一个全局st变量,但您在和中调用set!局部变量。您需要从函数中删除参数。如果您将参数重命名为其他内容(如),问题可能会更清楚。pushpopstststack

(define (push x stack)
  (set! stack (cons x stack)))   ; stack is mutated, but st remains unchanged
于 2013-04-12T06:28:24.090 回答
0

您正在使用全局状态,即st并将st作为参数传递给 push,这导致本地stin push 被更新而全局st保持不变'(0)

您可以通过摆脱全局来解决这个问题,st如下所示:

    (define (push x st)
      (cons x st))

    (define (pop st)
      (values (car st) (cdr st)))

用法:

    (let ((stack '(0)))
      (define-values (v s) (pop (push 2 stack)))
      v)
于 2013-04-12T06:30:11.700 回答
-1

这是我的版本/实现:

(define stack empty)

(define (push x)
  (set! stack (append stack (list x))))

(define (pop)
  (define reversedStack (reverse stack))
  (define result (car reversedStack))
    (set! stack (reverse (cdr reversedStack)))
     result)
于 2020-11-11T22:51:49.780 回答