微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从循环宏进行递归调用

如何解决从循环宏进行递归调用

对于Lisp来说,我还很陌生,并且一直困扰于一个特定的问题。我想编写的函数需要两个参数:一个函数一个List。它遍历列表,并在列表中的每个元素上调用给定的函数。如果函数返回true,则将元素添加到返回的子列表中

到目前为止,我尝试过的是:

(defun myFunc(f l)
  (loop for x in l
        if (listp x) do (myFunc f x)
        else if (eql t (funcall f x))
        collect x
        )
  )

我为f提供的函数带有一个参数,如果它是一个数字,则返回true。到目前为止,如果aList是一个简单的列表,例如(1 2 3),我的代码就可以工作。但是,当我输入类似(1 2(4 5)7)的嵌套列表时,仅输出(1 2 7)而不是(1 2(4 5)7)。

我假设它与我的递归调用以及返回的内容有关。非常感谢您提供一些帮助

解决方法

有两个小问题。首先,我认为这只是一个错字,但是您需要将aFunc替换为f(因为您的代码中没有变量aFunc)。

现在是问题的重点。在您的else if分支中,当谓词为true时,您可以正确collect的值。但是在递归的情况下,您只需要运行一些代码并丢弃结果即可。您也想在这里collect

(defun myFunc (f l)
  (loop for x in l
        if (listp x)
          collect (myFunc f x)
        else if (eql t (funcall f x))
          collect x))

最后,只是一个样式说明。如果谓词返回任何真值,而不仅仅是t,则将谓词视为真通常是惯用的。因此,如果我正在写这篇文章,我可能会用简单的(eql t (funcall f x))代替(funcall f x)。如果这是一项家庭作业,并且老师告诉您以其他方式进行,请坚持下去。但是,如果这是为了您的利益,您也可以考虑对其进行更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。