gpt4 book ai didi

recursion - 普通口齿不清 : Recursive "is-equal" function - results are incorrect

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

我在开发一个递归函数时遇到了问题,该函数将查看两个列表是否彼此相等,包括查看子列表。到目前为止,我有:

(defun are-equal2 (X Y)
(cond
((null X) nil)
((and (listp (first X)) (listp (first Y)))
(are-equal2 (first X) (first Y))
)
((eq (first X) (first Y))
T
)
)
)

它有时似乎有效。例如 (are-equal2 '((A) B) '((A) B)) 返回 T 和 (are-equal2 '((A) B) '(A B)) 返回零。但是 (are-equal2 '(F (A G) B) '(F (T G) B)) 返回 T..... 我认为这可能与我的最后一个条件有关。不过,我不确定如何重新处理它。

没关系哈哈。做了一些修补等待回复并得到它。做了一堆嵌套的 if 语句。代码:

(defun are-equal2 (X Y)
(if (and (listp (first X)) (listp (first Y)))
(are-equal2 (first X) (first Y))
(if (and (eq (first X) (first Y)))
(if (and (endp (rest X)) (endp (rest Y)))
T
(are-equal2 (rest X) (rest Y))
)
nil
)
)

)

最佳答案

我不认为你可以在这里使用尾递归版本。

恐怕您必须将您的论点视为,而不是序列

例如,

(defun are-equal (x y &key (test #'eql))
(or (funcall test x y)
(and (consp x)
(consp y)
(are-equal (car x) (car y))
(are-equal (cdr x) (cdr y)))))

这比较叶使用 eql默认情况下(参见 Rules about Test Functions ),而不是 eq在你的例子中:

(are-equal '((1) a) '((1) a))
==> T
(are-equal '((1) a) '((1) b))
==> NIL
(are-equal '((1) a) '((2) a))
==> NIL
(are-equal '(("1") a) '(("1") a))
==> NIL

关于recursion - 普通口齿不清 : Recursive "is-equal" function - results are incorrect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074111/

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