List 在c lisp中递归创建列表
我试图用lisp创建一个列表,从n开始,到2结束List 在c lisp中递归创建列表,list,recursion,common-lisp,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)))) 这似乎不起作用。有人帮忙吗?setq只更改一个变量。您需要首先定义它。如果您依赖一个全局变量,那么第二次运行结果时将包含上一次运行的元素。它很臭
(setq liste ())
(defun makeList (n)
(if (> n 2)
(setq liste (append (makeList (- n 1)) liste)
(setq liste (append liste 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))
;;递归
(取消生成列表(开始)
(如果(<开始2)
'()
(cons start(我的制造清单(1-start‘‘)’))
;; 带尾部递归
(取消生成列表(开始)
(标签((辅助对象(cur acc))
(如果(>当前启动)
行政协调会
(助手(1+cur)(cons cur acc(()())))
(助手2’()))
;; 带回路
(取消生成列表(开始)
(循环:对于n:从开始:向下到2
:收集
最后一个是最好的,因为CL不能保证尾部调用优化。请注意,由于所有列表都是从头到尾创建的,所以我反向执行尾部递归
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))
;;递归
(取消生成列表(开始)
(如果(<开始2)
'()
(cons start(我的制造清单(1-start‘‘)’))
;; 带尾部递归
(取消生成列表(开始)
(标签((辅助对象(cur acc))
(如果(>当前启动)
行政协调会
(助手(1+cur)(cons cur acc(()())))
(助手2’()))
;; 带回路
(取消生成列表(开始)
(循环:对于n:从开始:向下到2
:收集
最后一个是最好的,因为CL不能保证尾部调用优化。请注意,由于所有列表都是从头到尾创建的,所以我反向执行尾部递归 我是否需要先实例化列表,是否应该在某个地方写` defvar list()`呢?我是否需要先实例化列表,是否应该在某个地方写` defvar list()`呢?