我正在研究一个递归函数,它接受一个列表和值ex:'b'(a. b),如果找不到则返回nil,如果找到则返回t。我的问题是在行(cond((eq A(car L))t)中,即使在(cond(((and(atom L(eq A L)))t)返回之后,它似乎也在检查该条件。我的印象是,如果满足该条件,执行停止,函数返回。有什么方法可以解决这个问题吗?此外,我只能使用原始函数defuncond cons car cdr运算符,-,
;test cases
(checkInner 'b '(a . b))
(checkInner 'f '(c e f))
(checkInner 'b '(b))
;function
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
)
(cond ((or (atom L) (eq A L)) nil)
)
(cond ((eq A (car L)) t)
(t (checkInner A (cdr L))
)
)
)
@Barmar您基本上检查了两次L是一个< code>atom,第一次可以写成((atom L)(eq A L))< code >(eq A L)返回一个布尔值,所以您不需要从该子句显式返回< code>T,这与您的第二个子句< code>((atom L) nil)相矛盾。还要注意,这种html" target="_blank">解决方案不适用于嵌套的元素列表(这将是唯一愿意编写自己的递归函数的参数,而不仅仅是使用Lisp函数来测试成员资格,如< code>member、< code>find等。)
(checkInner 'b '(a (c (d (b))))) ; => NIL
以下是一个适用于嵌套列表的递归定义。请注意,您还可以提供相等性测试函数来允许您的X
具有不同的类型。
(defun check-inner (x coll &key (test #'eq))
"Check if X is in the collection. Works on nested lists
and uses the test keyword argument for equality checking."
(cond
((null coll) nil)
((listp (car coll)) (or (check-inner x (car coll) :test test)
(check-inner x (cdr coll) :test test)))
((atom (car coll)) (or (funcall test x (car coll))
(check-inner x (cdr coll) :test test)))
(t (check-inner x (cdr coll :test test)))))
现在,您正在寻找的东西也可以隐藏在列表中的嵌套图层中:
(check-inner 'b '(a (c (d (b))))) ; => T
检查其他类型也没有问题:
(check-inner "b" '(a (c (d ("b")))) :test #'string=) ; => T
所以我把它修好了,谢谢你的确认,这是我的解决方案
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
(t (cond ((or (atom L) (eq A L)) nil)
(t (cond ((eq A (car L)) t)
(t (checkInner A (cdr L))
)
)
)
)
)
)
)
除非使用显式(从checkInner值返回)
表达式,否则函数将返回其最后一个表达式的值。因此,函数返回的唯一值是最后一个cond
表达式;前两个测试被忽略。
您需要将所有案例合并到一个 COND
表达式中。
此外,第二个测试不应使用或
。如果<code>L</code>是一个原子,它将不等于<code>L
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
((atom L) nil)
((eq A (car L)) t)
(t (checkInner A (cdr L)))))
几个月前我学习了递归,现在这一切都很混乱。有一个人可以解释我整个功能是如何正常工作的,但我有点明白它是如何工作的,但我认为有些步骤在我的脑海中并不是很清楚。病人的Thx提前。
在PHP中,检查数组是否为递归数组的最佳方法是什么? 给定以下代码: 从PHP手册: print\u r()在到达数组的第三个元素时将显示递归。 似乎没有其他方法可以扫描数组中的递归引用,因此如果需要检查它们,则必须使用print\u r()及其第二个参数来捕获输出并查找单词RECURSION。 还有更优雅的检查方式吗? 附:这就是我如何使用regex和print\u r()检查和获取递归数组键的
我创造了这个二叉查找树。我使用循环和递归编写了两种形式的插入方法。递归代码虽然看起来是正确的,但并不工作,我想不出问题是什么。当我使用insertRecursion方法创建树时,leftChild和rightChild总是为null。 }
当childIds参数有值时,查询可以正常工作。但是childIds是一个可选参数,它可能是一个空列表或null,在这种情况下我想忽略where子句并简单地返回 所以我将查询修改为: 现在,当childIds为空(=[])时,该查询返回0个结果,因为为false,(:childIds)中的
有递归函数的问题,应该相对简单做,但似乎不能得到正确的。 我有一个文件夹结构,它的文件夹可以包含其他文件夹、图像或文件。每个文件夹都有权限。我想让我的函数递归地构建一个与每个文件夹关联的权限列表。 改了号, 得到:
我正在尝试在XSLT 2.0中编写一个尾递归函数,它遍历日期的多值变量并返回最早的一个。出于某种原因,我的函数未被SaxonHE9.4识别为尾递归,当输入文件有超过150-200个条目左右时,我会收到以下错误: tail\u rec\u测试第73行出错。xsl:嵌套函数调用太多。可能是由于无限递归。内置模板规则 以下是我的xml输入: 这就是我的xsl-file的样子: 如何将其转换为正确的尾部递