我写了两个版本的 lisp 函数。两者之间的主要区别在于,一个是通过递归完成的,而另一个是通过迭代完成的。
这是递归版本(没有副作用!):
(defun simple-check (counter list)
"This function takes two arguments:
the number 0 and a list of atoms.
It returns the number of times the
atom 'a' appears in that list."
(if (null list)
counter
(if (equal (car list) 'a)
(simple-check (+ counter 1) (cdr list))
(simple-check counter (cdr list)))))
这是迭代版本(有副作用):
(defun a-check (counter list)
"This function takes two arguments:
the number 0 and a list of atoms.
It returns the number of times the
atom 'a' appears in that list."
(dolist (item list)
(if (equal item 'a)
(setf counter (+ counter 1))
(setf counter (+ counter 0))))
counter)
据我所知,它们都有效。但我真的很想避免迭代版本中的副作用。我想回答两个问题:
- 是否可以避免副作用并保持迭代?
- 假设#1 的答案是肯定的,那么最好的方法是什么?