Common lisp 在lisp中检查数字是偶数还是奇数

Common lisp 在lisp中检查数字是偶数还是奇数,common-lisp,clisp,Common Lisp,Clisp,我需要用lisp编写一个递归方法,将奇数值加倍,而将偶数值单独保留 到目前为止,我已经: (defun MY-DOUBLE-ODD (n) (if (oddp n) (setq n (* n 2))) n) 然而,我就是不知道如何让这个递归方法遍历整个列表 如何修复它以使其在中迭代(MY-DOUBLE-ODD(123456)) ?您的解决方案根本不应涉及setq。递归应用于迭代参数列表,使用car获取第一个元素,cdr获取列表的其余部分进行递归,使用cons构建递归调用返

我需要用lisp编写一个递归方法,将奇数值加倍,而将偶数值单独保留

到目前为止,我已经:

(defun MY-DOUBLE-ODD (n)
   (if (oddp n)
     (setq n (* n 2)))
   n)
然而,我就是不知道如何让这个递归方法遍历整个列表

如何修复它以使其在
中迭代(MY-DOUBLE-ODD(123456))

您的解决方案根本不应涉及
setq
。递归应用于迭代参数列表,使用
car
获取第一个元素,
cdr
获取列表的其余部分进行递归,使用
cons
构建递归调用返回的结果。

使用单独的函数进行递归处理,让它在每个元素上调用
MY-DOUBLE-ODD
,这不是免费的编码服务。你必须自己尝试解决这个问题。如果您无法让它工作,请发布您尝试的内容,我们将帮助您修复它。在返回可能加倍的数字的函数内部使用
setq
没有任何问题。那么,它应该返回加倍的数字
Setq
通常是这些琐碎任务的代码气味。Setq的使用混淆了代码的意图,即返回未更改的偶数,并且几率加倍。代码确实做到了这一点,但同样,这一点很难看到。noob学习Lisp是有原因的,所以鼓励函数式风格是有意义的。Barmar,我不想和你争论Lisp,但你会认真地用setq来编写这段代码吗?我并没有说这是一种风格上的批评,而是帮助指导那些正在做家庭作业的人找到一个干净的解决方案。我的意思是,这里一半的技巧是帮助那些正在问家庭作业问题的人。也许我不应该这样做作为一种实践。。。