Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在c lisp中递归创建列表_List_Recursion_Common Lisp - Fatal编程技术网

List 在c lisp中递归创建列表

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只更改一个变量。您需要首先定义它。如果您依赖一个全局变量,那么第二次运行结果时将包含上一次运行的元素。它很臭

我试图用lisp创建一个列表,从n开始,到2结束

(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()`呢?