1

我们今天在课堂上刚刚介绍了循环,我有一些事情需要做。简而言之,我必须使用循环而不是递归来构建一个列表。我似乎在这里遇到了绊脚石。对于这个例子,我们需要做一个简单的倒计时。该函数接受一个参数,然后返回小于或等于初始参数的所有正整数的列表。(倒计时 5) => (5 4 3 2 1)

无论出于何种原因,我都很难获得循环。我们谈到的是 Loop、Do、Dotimes 和 Dolist。我已经尝试了几个循环,并且总是得到类似的结果。

(defun countdown (num)
  (cond ((= num 0) nil)
        (T  (let* ((list nil))
              (loop
                (if (= num 0) (return list)
                    (setf list (cons list num)))
                (setf num (- num 1)))))))

我的输出显示如下:

(((((NIL . 5) . 4) . 3) . 2) .1)

更新:我已经解决了这个问题。显然我需要颠倒 中的顺序cons,所以num在前面list。有人愿意解释一下吗?我以为您将列表放在首位,然后将您放在第二位的内容添加到列表的末尾。至少,到目前为止我是这样使用它的,没有问题。

4

3 回答 3

4

将论点颠倒过来cons(以及为什么)

您在答案中写道(因为它要求提供更多信息,所以可能应该是评论):

我已经解决了这个问题。显然我需要颠倒 cons 中的顺序,所以 num 在 list 之前。有人愿意解释一下吗?我以为您将列表放在首位,然后将您放在第二位的内容添加到列表的末尾。至少,到目前为止我是这样使用它的,没有问题。

该功能清楚地记录在 HyperSpec 中:Function CONS。文档中的示例显示,例如,

(cons 1 (cons 2 (cons 3 (cons 4 nil)))) =>  (1 2 3 4)
(cons 'a (cons 'b (cons 'c '()))) =>  (A B C)
(cons 'a '(b c d)) =>  (A B C D)

甚至是注释

如果 object-2 是一个列表,则 cons 可以被认为是生成一个新列表,它与它类似,但前面有 object-1。

通读14.1.2 Conses as Lists可能会有所帮助,其中包括:

列表是一个 conses 链,其中每个 cons 的 car 是列表的一个元素,每个 cons 的 cdr 要么是链中的下一个链接,要么是终止原子。

关于loop

这里的许多答案都在向您指出循环形式包含一种特殊的迭代语言。没错,但它也可以按照您使用它的方式使用。这种方式称为简单循环

6.1.1.1.1 简单循环

简单的循环形式是一种仅包含复合形式的主体。从左到右依次评估每个表单。当最后一个表单被评估后,第一个表单被再次评估,以此类推,在一个永无止境的循环中。一个简单的循环形式建立了一个名为 nil 的隐式块。可以通过将控制显式转移到隐式块(使用return 或return-from)或块外的某个退出点(例如,使用throw、go 或return-from)来终止简单循环的执行。

简单的循环可能不像使用循环提供的更好功能的循环那样普遍,但是如果您只是在课堂上介绍了这一点,那么您可能还没有。不过,其他答案确实提供了一些很好的例子。

于 2014-09-17T11:46:13.973 回答
2

If you speaking about common lisp loop, your countdown may look like this:

(defun countdown (from-number)
  (loop :for x :from from-number :downto 1 :collect x)) 

CL-USER> (countdown 10) 
(10 9 8 7 6 5 4 3 2 1)
于 2014-09-17T04:30:59.890 回答
1

Using loop, which has its own "special-purpose language" that does not really look like Lisp:

(defun countdown (n)
  (loop
    for i from n downto 1
    collect i))

Or using do:

(defun countdown (n)
  (do ((i 1 (1+ i)) 
       (res nil (cons i res)))
      ((> i n) res)))

See here, especially chapters 7 and 22.

于 2014-09-17T04:31:24.823 回答