我正在尝试在lisp中创建一个从n开始到2结尾的列表。
(setq liste ())
(defun makeList (n)
(if (> n 2)
(setq liste (append (makeList (- n 1)) liste)
(setq liste (append liste 2))))
这似乎不起作用。有人帮忙吗?
答案 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不保证尾调用优化。请注意,我会反向执行尾递归,因为所有列表都是从头到尾制作的。