我正在尝试项目的euler问题来学习常见的口齿不清,而且我很早就被卡住了.在问题1上,问题是从1到1000的整数之和.我认为下面的代码应该这样做,但它总是返回end(如果它是mod 3或mod 5)或0的值.
(defun mod3or5 (n)
(cond
((equal (mod n 5) 0) n)
((equal (mod n 3) 0) n)
(0))))
(defun mod-sum (start end)
(cond
((equal start end) (mod3or5 start))
(+ (mod3or5 start) (mod-sum (+ start 1) end))))
Run Code Online (Sandbox Code Playgroud)
例如
(mod-sum 1 9)
=> 9
(mod-sum 1 8)
=> 0
Run Code Online (Sandbox Code Playgroud)
我希望答案分别为23和14.
给出的每个表格cond都有表格(condition exp1 ... expn).如果condition为true,它将评估所有表达式并返回值expn.如果condition为false,它将继续下一个表单.
你的最后一个表格是:(+ (mod3or5 start) (mod-sum (+ start 1) end)).所以这里+是条件(它总是为真,因为它+是一个函数,因此不是nil),(mod3or5 start)是第一个表达式(将被评估,但不返回),并且(mod-sum (+ start 1) end)是最后一个表达式(将被评估然后返回).
cond通过选择t条件来实现"其他分支" .所以你的最后一个表格应如下所示:
(t (+ (mod3or5 start) (mod-sum (+ start 1) end)))
Run Code Online (Sandbox Code Playgroud)