如何在LISP中将列表中的每个元素增加1

如何在LISP中将列表中的每个元素增加1,lisp,common-lisp,increment,Lisp,Common Lisp,Increment,我正在学习LISP,并试图编写一个函数,将列表中的每个元素添加1。我首先测试第一个元素是否为数字,然后将1添加到列表中的第一个元素。然后我递归地调用列表其余部分的函数,但是我得到了一个错误。有什么帮助吗?下面是函数: (defun add-1-all (L) (cond (not (numberp (first L)) nil) (t (+1 (first L)) (add-1-all (rest L))))) 你可以写(+1(第一个L))或(1+(第一个L)),

我正在学习LISP,并试图编写一个函数,将列表中的每个元素添加1。我首先测试第一个元素是否为数字,然后将1添加到列表中的第一个元素。然后我递归地调用列表其余部分的函数,但是我得到了一个错误。有什么帮助吗?下面是函数:

 (defun add-1-all (L)
    (cond (not (numberp (first L)) nil)
          (t (+1 (first L)) (add-1-all (rest L)))))
你可以写(+1(第一个L))或(1+(第一个L)),但你没有写

此外,还应该使用cons将第一个元素的结果与其余元素的结果绑定在一起。 另外,您真的想删除第一个非数字后面的所有元素吗?或者你想假设所有元素都是数字,在这种情况下,你应该学习map或mapcar,它允许你用15个字符来解决问题。

你可以写(+1(第一个L))或(1+(第一个L)),但你没有写

此外,还应该使用cons将第一个元素的结果与其余元素的结果绑定在一起。
另外,您真的想删除第一个非数字后面的所有元素吗?或者您想假设所有元素都是数字,在这种情况下,您应该了解map或mapcar,它允许您用15个字符来解决问题。

实现目标的最简单方法是使用map。映射将函数应用于序列的每个元素。这样一来,就不必考虑像遍历序列这样的细节。在下面的代码中,我使用mapcar,它只对列表有效

(defun add-1 (list)
  (mapcar #'1+ list))
要了解CL提供的其他映射函数,请运行并使用(描述)了解更多信息。或者更好地使用或

您提供的解决方案试图通过递归解决问题。总体思路是使用first/rest遍历列表,同时使用递增1的元素构建一个新的列表。当列表到达末尾时(您可以使用null或endp函数测试是否已到达列表的末尾),应返回新列表。您的解决方案的问题之一是缺少累加器。另外,您的基本情况(发出停止递归信号的条件)是错误的


还有一些其他的指示。使用编辑器格式化代码,因为它很难阅读。此外,CL不是Lisp-1,所以您可以使用list作为变量名,并且它不会与函数列表冲突。它们有单独的名称空间。发布错误消息和解释您的解决方案试图做什么/如何做也很有帮助。您可能还发现学习Lisp很有用。实现目标的最简单方法是使用map。映射将函数应用于序列的每个元素。这样一来,就不必考虑像遍历序列这样的细节。在下面的代码中,我使用mapcar,它只对列表有效

(defun add-1 (list)
  (mapcar #'1+ list))
要了解CL提供的其他映射函数,请运行并使用(描述)了解更多信息。或者更好地使用或

您提供的解决方案试图通过递归解决问题。总体思路是使用first/rest遍历列表,同时使用递增1的元素构建一个新的列表。当列表到达末尾时(您可以使用null或endp函数测试是否已到达列表的末尾),应返回新列表。您的解决方案的问题之一是缺少累加器。另外,您的基本情况(发出停止递归信号的条件)是错误的


还有一些其他的指示。使用编辑器格式化代码,因为它很难阅读。此外,CL不是Lisp-1,所以您可以使用list作为变量名,并且它不会与函数列表冲突。它们有单独的名称空间。发布错误消息和解释您的解决方案试图做什么/如何做也很有帮助。您可能会发现学习Lisp也很有用。首先,如果您编译代码时遇到了一些错误和警告,那么编写一个好的Lisp语法并了解您正在编写的代码是很重要的。如果您正在学习lisp,我建议您为类似的问题提供一个舒适的环境

然后使用递归来完成这项任务是一个好主意,因为知道何时停止递归以及算法的基本情况非常重要

在您的情况下,您也可以使用if,对于这两条路径,函数如下:

(defun add-1-all (list)
  (cond
    ((null list) nil)
    (t (cons (1+ (car list))(add-1-all (cdr list))))))
我建议您尝试使用尾部递归函数来实现这一点,以获得更好的性能和更好的学习效果

此外,使用lisp还可以使用更多的函数样式,到时候您将了解这一点,就像使用高阶函数一样。在这种情况下,您的函数如下所示:

;; functional programming higher order functions
(defun add-1-all-ho (list)
  (mapcar #'1+ list))

首先,你的代码是错误的,如果你编译它,你会得到几个错误和警告,一个好的lisp语法很重要,而且知道你在写什么。如果您正在学习lisp,我建议您为类似的问题提供一个舒适的环境

然后使用递归来完成这项任务是一个好主意,因为知道何时停止递归以及算法的基本情况非常重要

在您的情况下,您也可以使用if,对于这两条路径,函数如下:

(defun add-1-all (list)
  (cond
    ((null list) nil)
    (t (cons (1+ (car list))(add-1-all (cdr list))))))
我建议您尝试使用尾部递归函数来实现这一点,以获得更好的性能和更好的学习效果

此外,使用lisp还可以使用更多的函数样式,到时候您将了解这一点,就像使用高阶函数一样。在这种情况下,您的函数如下所示:

;; functional programming higher order functions
(defun add-1-all-ho (list)
  (mapcar #'1+ list))

以下是更多的方法:

  • 在处理列表(见Joshua的评论)时,使用和,它们比
    NULL
    CAR
    CDR
    更可取。它们更清楚地表达了意图,如果是
    ENDP
    ,请检查参数是否是正确的列表。假设你经过一个用
    (cons'a'b)
    构建的虚线列表,会发生什么
    ENDP
    检测到列表不正确并发出错误信号

    (defun add-1-all (list)
      (unless (endp list)
        (cons (1+ (first list))
              (add-1-all (rest list)))))
    
  • 我对其
    NIL
    值使用了
    ,除非