以递归方式在c lisp中创建一个列表

时间:2017-05-30 09:50:55

标签: list recursion common-lisp

我正在尝试在lisp中创建一个从n开始到2结尾的列表。

(setq liste ())


(defun makeList (n)
    (if (> n 2)
        (setq liste (append (makeList (- n 1)) liste)
        (setq liste (append liste 2))))

这似乎不起作用。有人帮忙吗?

1 个答案:

答案 0 :(得分:2)

setq仅更改变量。您需要先定义它。如果依赖于全局变量,那么第二次结果将包含上一次运行的元素。它非常臭!

;; With recursion
(defun my-make-list (start)
  (if (< start 2)
      '()
      (cons start (my-make-list (1- start)))))

;; with tail recursion
(defun my-make-list (start)
  (labels ((helper (cur acc)
             (if (> cur start)
                 acc
                 (helper (1+ cur) (cons cur acc)))))
    (helper 2 '())))

;; With loop
(defun my-make-list (start)
  (loop :for n :from start :downto 2
        :collect n))

最后一个是最好的,因为CL不保证尾调用优化。请注意,我会反向执行尾递归,因为所有列表都是从头到尾制作的。