我正在尝试用 d 交换数字列表的第 n 位。我找到了一种用 1 替换第 n 位数字的方法,但我不知道如何概括它,以便我可以使用definec
通用字母替换第 n 位数字。
(defun update-nth (key val l)
(declare (xargs :guard (true-listp l))
(type (integer 0 *) key))
(cond ((zp key) (cons val (cdr l)))
(t (cons (car l)
(update-nth (1- key) val (cdr l))))))
我们有兴趣检测错误,例如无效的票号。我们想要展示的是,如果一个票号写错了,例如,有一个常见的错误(改变一个数字或调换两个相邻的数字),那么生成的票将是无效的。
首先,我们需要编写执行这两种错误的函数。即,编写一个函数,该函数
(change-nth-digit-to ticket n d)
返回一个与旧票相等的新票,只是第 n 个数字是 d。另外,编写一个名为的函数,该函数(transpose-nth-digit ticket n)
返回一张票,其中第 n 个数字与下一个数字交换。重要提示:我们稍后将使用这些函数,所以不要将它们编写为仅用于机票。编写它们,以便它们适用于任意数字列表。
注意:如果票证中有数字,n 应介于 0 和 -1 之间(对于 change-nth-digit-to)和介于 0 和 -2 之间(对于 transpose-nth-digit)。