如何在LISP中将列表中的每个元素增加1
我正在学习LISP,并试图编写一个函数,将列表中的每个元素添加1。我首先测试第一个元素是否为数字,然后将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)),
(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))
以下是更多的方法:
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
值使用了,除非