【问题标题】:create a list in c lisp recursively递归地在 C lisp 中创建一个列表
【发布时间】:2017-05-30 09:50:54
【问题描述】:

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

(setq liste ())


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

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

【问题讨论】:

  • 我还需要先实例化列表,我应该在某处写'defvar list()'吗?

标签: list recursion common-lisp


【解决方案1】:

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 不保证尾调用优化。请注意,我反向执行尾递归,因为所有列表都是从头到尾创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多