我正在尝试用LISP编写此代码,但遇到了很多麻烦。
这是我目前所拥有的:
(defun list_incr (x)
(if (eq (first x) nil)
x
(if (< (first x) (first(rest x)))
(append (list (first x) (first(rest x))) (list_incr (rest(rest x))))
(list_incr (cons (first x) (rest(rest x)))))))
Run Code Online (Sandbox Code Playgroud)
如果给出列表(1 3 2 4),则需要返回(1 3 4)。目前,我的代码对连续两个递增的数字都可以用,但是当它减小时就不再起作用了。
我需要代码从给定列表返回数量递增的列表。
一些例子:
如果给出列表(1 2 4 6 5),则应返回(1 2 4 6)
如果给出(3 1 4 5 2 6),则应返回(3 4 5 6)
谢谢!
这是解决问题的可能的递归定义:
(defun exercise-1d (x)
(cond ((null x) nil)
((null (rest x)) x)
((> (second x) (first x)) (cons (first x) (exercise-1d (rest x))))
(t (exercise-1d (cons (first x) (rest (rest x)))))))
Run Code Online (Sandbox Code Playgroud)
递归有两种最终情况:列表为空或包含单个元素时。在这两种情况下,都会返回当前列表。
经过前两个测试后,我们确定列表中至少包含两个元素,因此我们可以开始检查前两个元素之间的关系。
如果第二个元素大于第一个元素,则包括第一个元素,并将递归应用于列表的其余部分。
另一方面,如果第二个元素不大于第一个元素,则将其跳过,并将递归应用于第一个元素和第二个元素之后的所有元素组成的列表。