LISP 帮助!糖果机分配器

标签 lisp common-lisp

<分区>

大家好,我是新来的,我想知道你们是否可以给我任何帮助。我正在创建一个随机分配颜色的糖果机。我已经运行了这段代码,它为 (get-candy gummy-bear) 运行了 7 次,但它应该运行 4 次直到 nil .

所以这是我的代码:

 ;;; function get-candy
(defun get-candy (machine)
  (funcall machine))

;;; variable colors
(defvar *colors* '(red blue green brown yellow purple))

;;; function generate-candy-supply
(defun generate-candy-supply (num)
 (if (= 0 num)
    (cons (nth (+ 1 (random (- (length *colors*) 1))) *colors*) *colors* )
    (generate-candy-supply (- num 1))))


;;; function candy-machine
(defun candy-machine (candy)
  (function
    (lambda ()
      (prog1 (car candy)
        (setq candy (cdr candy))))))


;;; variable gummy-bear
(defvar *gummy-bear*
  (candy-machine (generate-candy-supply 4)))

;;; variable easter-egg
(defvar *easter-egg*
  (candy-machine (generate-candy-supply 6)))

样本运行应如下所示:

[1]> (load 'candy.lisp)
;; Loading file candy.lisp ...
;; Loaded file candy.lisp
T
[2]> (get-candy *gummy-bear*)
BLUE
[3]> (get-candy *gummy-bear*)
BROWN
[4]> (get-candy *gummy-bear*)
YELLOW
[5]> (get-candy *gummy-bear*)
YELLOW
[6]> (get-candy *gummy-bear*)
NIL
[7]> (get-candy *easter-egg*)
BLUE
[8]> (get-candy *easter-egg*)
BROWN
[9]> (get-candy *easter-egg*)
GREEN
[10]> (get-candy *easter-egg*)
BROWN
[11]> (get-candy *easter-egg*)
YELLOW
[12]> (get-candy *easter-egg*)
BLUE
[13]> (get-candy *easter-egg*)
NIL

最佳答案

您的问题是函数 generate-candy-supply。它有两个分支,具体取决于 num。如果它不是 0,则使用 (1- num) 进行递归,什么都不做。当 num0 时,您返回一个列表,该列表以 *colors* 的随机元素开头,后跟 *colors*< 的元素。这将始终生成一个恰好包含 7 个元素的列表。

我暂时就此打住,您可以尝试找出解决方案。欢迎在评论中提出更多问题。

关于LISP 帮助!糖果机分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393012/

相关文章:

recursion - 没有 + 或 * 的乘法

ruby-on-rails - 带有 yasnippets 的 emacs 智能选项卡

garbage-collection - 没有用于低级编程的垃圾收集器的 Lisp

lisp - 谁能给我一些关于这个问题(家谱)的提示?

file - 如何在 Lisp 中创建和写入文本文件

tree - 打开音乐 : L-System tree generation using lisp

list - Lisp,关于列表和递归的几个问题

c++ - 在 C/C++ 中实现解释器所需的引用资料

macros - 在宏定义中混淆

loops - Common Lisp - 将函数应用于列表中的每个其他元素