我正在学习球拍和新功能编程,并为堆栈编写了以下代码:
(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。
我做错了什么。
答案 0 :(得分:1)
您有一个全局st
变量,但您在set!
和push
的本地变量上调用pop
。您需要从函数中删除st
参数。如果将st
参数重命名为其他内容(如stack
),问题可能会更明显。
(define (push x stack)
(set! stack (cons x stack))) ; stack is mutated, but st remains unchanged
答案 1 :(得分:0)
您正在使用全局状态即st
并将st
作为参数传递以推送,这会导致推送中的本地st
更新并且全局{{1} }仍然是st
。
您可以通过删除全局'(0)
来解决此问题,如下所示:
st
用法:
(define (push x st)
(cons x st))
(define (pop st)
(values (car st) (cdr st)))
答案 2 :(得分:-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)