Common Lisp函数返回错误的值

mun*_*unk 0 common-lisp

我正在尝试项目的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.

sep*_*p2k 5

给出的每个表格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)