gpt4 book ai didi

list - Scheme中后进先出列表的实现

转载 作者:行者123 更新时间:2023-12-01 23:32:31 25 4
gpt4 key购买 nike

我在 Scheme 中实现 LIFO 列表时遇到了一些问题。如果我只想将一个元素压入堆栈,我的代码就可以正常工作,但我希望能够压入多个元素。这是我的代码:

(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”中取出元素并将它们一个一个地添加到堆栈中。 “推”过程根本不起作用,我只是在最后一行收到错误(也许我的递归是错误的)。正如我所说,这是我最后一次尝试,我只是无法理解它。

编辑:

我现在尝试实现 push!, pop!和堆栈作为独立的过程,将堆栈对象作为参数。流行音乐!并插入!很容易,但在插入!我要添加的元素已经嵌套在推送中的列表中!所以当我将它发送到 make-stack 过程时,它以嵌套列表的形式出现。我试图做一个递归过程来解决这个问题:

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

这只是进入一个循环,我不明白为什么...(递归对我来说是个大问题)

最佳答案

也许:

(define (make-stack)
(let ((stack '()))
(lambda (msg . args)
(cond
[(eq? msg 'pop!) (set! stack (cdr stack))]
[(eq? msg 'push!) (set! stack (append (reverse args) stack))]
[(eq? msg 'stack) stack]
[else "Not valid message!"]))))

(define s (make-stack))
(s 'push! 'a)
(s 'push! 'b 'c 'd)
(s 'stack)
(s 'pop!)
(s 'stack)

输出:

'(d c b a)
'(c b a)

关于list - Scheme中后进先出列表的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29244677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com