Vijay 为 Scheme 提供了最佳解决方案。但是,如果您真的想通过永久更改列表来完成这项工作,则需要使用set-car!
and set-cdr!
。这在 Scheme 中并不自然,需要一些技巧才能使其工作:
首先定义hand
和deck
:
(define hand '(dummy))
(define deck '((2 C) (3 H) (K D)))
hand
必须从现有元素开始,以便它有一些现有的列表结构要修改。您不能将set-car!
andset-cdr!
与 nil ( '()
) 一起使用。
现在写draw
:
(define (draw from to)
; push the top element of `from` onto `to`
(set-cdr! to (copy to))
(set-car! to (car from))
; pop the top element of `from` off
(set-car! deck (cadr deck))
(set-cdr! deck (cddr deck)))
; also we need to define copy
(define (copy l)
(map (lambda (x) x) l))
这意味着您手中的最后一个元素将始终是哑元。最好为初始案例添加检查并覆盖它而不是推送:
(define (draw from to)
; push the top element of `from` onto `to` (just overwrite the first time)
(when (pair? (cdr to))
(set-cdr! to (copy to)))
(set-car! to (car from))
; pop the top element of `from` off
(set-car! deck (cadr deck))
(set-cdr! deck (cddr deck)))
此外,您应该在做任何事情之前检查它from
是否为空。