这是我在LISP的第一个项目。我们使用的语言是TinyLISP(http://www.ugcs.caltech.edu/~rona/tlisp/tlspec.html)。
我正在编写一个获得自然数num的程序,并返回从0到num(包括)的所有数字的总和,它们是3或5的倍数。
我有一个函数来确定它是3或5的倍数写的,但是我坚持的部分是我试图将所有变量保存到2个不同列表的地方。
例如,如果给出一个数字(如5),我从数字5开始,然后将数字提交到我的函数中,确定它是3还是5的倍数。我想存储返回的任何变量对于一个列表为True,然后将任何作为NIL返回的列表放入另一个列表中。问题是我无法弄清楚如何调用我之前创建的列表。该列表需要包含之前调用它的所有值。
如何修复此列表问题?
答案 0 :(得分:2)
从这开始:
(defun sumx (n m) (sumx_aux n m ....... ))
(defun sumx_aux (n m x s) (if (> x n) s (sumx_aux n m (+ x m) ..... )))
这个sumx
函数做了什么?
填写空白,找出你如何使用它,你差不多完成了。 :)
如果您需要其他线索,请阅读inclusion-exclusion principle。基本上,这里是减去两次计算的数字。
但是如果你坚持实际构建你的两个列表,那么你可以通过在递归函数中添加两个累积参数,然后添加一个你当前拥有的一个或另一个,在if
的两个子句中的两个单独的递归调用中:
(defun foo_loop ( ... a b )
...
(if ...
(foo_loop ... (cons c a) b)
(foo_loop ... a (cons c b))))