gpt4 book ai didi

lisp - 在列表中搜索整数 (Lisp)

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:46 24 4
gpt4 key购买 nike

我想不出一种方法来搜索列表以确保它包含所有整数。如果有非整数数据,我想立即返回nil,如果没有,则继续我的函数。

我尝试制作的递归函数将 cons car 与列表的 cdr。通过我所做的尝试,我无法返回 nil。我只能忽略非整数数据。例如,(add-1-all '(1 2 3 a)) 将在每个数字加一后返回 (2 3 4)

    (defun add-1-all (L) 
(if (null L)
L
(if (integerp (car L))
(cons (+ (car L) 1) (add-1-all (cdr L)))
nil)))

我确实理解是缺点导致了这种情况发生,因为递归正在添加到列表中。

最佳答案

你的第一句话,

I cannot think of a way to search a list in Lisp to make sure it has all integers.

听起来像是您想检查一个列表是否全是整数。您可以使用 every检查列表是否全部为整数:

CL-USER> (every 'integerp '(1 2 3 4))
;=> T
CL-USER> (every 'integerp '(1 2 a 4))
;=> NIL

every 将处理短路,即,一旦找到第一个不符合谓词的元素,就返回 nil

但是,您的代码听起来像是您想要映射一个列表,收集应用于每个整数的函数值并返回收集的值,除非遇到非整数,否则返回 null。也许最简单的方法是使用 loop宏。一个解决方案看起来与英文规范几乎相同:

CL-USER> (loop for x in '(1 2 3 4)
if (not (integerp x)) return nil
else collect (1+ x))

;=> (2 3 4 5)
CL-USER> (loop for x in '(1 2 a 4)
if (not (integerp x)) return nil
else collect (1+ x))

;=> NIL

与递归解决方案相比,使用 loop 执行此操作也有一些优势。虽然 Lisp 家族中的一些语言(例如 Schema)需要尾调用优化,并且一些 Common Lisp 实现也这样做,但在 Common Lisp 中不需要。因此,如果您使用迭代解决方案(例如,使用 loop)而不是递归(即使是尾递归),它会更安全(例如,您不会用完堆栈空间) ) 实现。

关于lisp - 在列表中搜索整数 (Lisp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com