Common lisp 返回错误值的公共Lisp函数

Common lisp 返回错误值的公共Lisp函数,common-lisp,Common Lisp,我正在尝试学习CommonLisp的项目euler问题,但我很早就被卡住了。在问题1中,问题是从1到1000的整数之和。我认为下面的代码应该这样做,但它总是返回end(如果是mod 3或mod 5)或0的值 (defun mod3or5 (n) (cond

我正在尝试学习CommonLisp的项目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)))) 
比如说

(mod-sum 1 9)
=> 9
(mod-sum 1 8)
=> 0

我希望答案分别是23和14

cond
的每个表单都有
(条件exp1…expn)
。如果
condition
为true,它将计算所有表达式并返回
expn
的值。如果
条件
为false,它将继续下一个表单

您的最后一个表单是:
(+(mod3or5start)(modsum(+start 1)end))
。因此这里的条件是
+
(mod3or5 start)
是第一个表达式(将被计算但不返回),
(mod sum(+start 1)end)
是最后一个表达式(将被计算然后返回)

cond
中的“Else分支”通过选择
t
作为条件来实现。因此,您的最后一个表单应该如下所示:

(t (+ (mod3or5 start) (mod-sum (+ start 1) end)))

cond
的每个表单都有
(条件exp1…expn)
。如果
condition
为true,它将计算所有表达式并返回
expn
的值。如果
条件
为false,它将继续下一个表单

您的最后一个表单是:
(+(mod3or5start)(modsum(+start 1)end))
。因此这里的条件是
+
(mod3or5 start)
是第一个表达式(将被计算但不返回),
(mod sum(+start 1)end)
是最后一个表达式(将被计算然后返回)

cond
中的“Else分支”通过选择
t
作为条件来实现。因此,您的最后一个表单应该如下所示:

(t (+ (mod3or5 start) (mod-sum (+ start 1) end)))

我以前发布过这篇文章,但它是在Scheme中,所以我决定用
loop
稍作修改:

(defun euler-1 ()
  (loop with x = (list 3 2 1 3 1 2 3)
     for i in (nconc x x)
     while (< (+ steps i) 1000)
     summing i into steps
     summing steps into result
     finally (return result)))
(defun euler-1()
(循环x=(列表3 2 1 3)
对于i in(nconc x x)
而(<(+步骤i)1000)
将我归纳为步骤
将步骤求和为结果
最后(返回结果)))

这就是你可以做到的,避免模块化(因为它很昂贵)。您还可以平均步骤2个数字(跳过您不需要添加的数字)。

我以前发布过这篇文章,但它是在Scheme中,所以我决定在一点时间内重写它,使用
循环进行更改:

(defun euler-1 ()
  (loop with x = (list 3 2 1 3 1 2 3)
     for i in (nconc x x)
     while (< (+ steps i) 1000)
     summing i into steps
     summing steps into result
     finally (return result)))
(defun euler-1()
(循环x=(列表3 2 1 3)
对于i in(nconc x x)
而(<(+步骤i)1000)
将我归纳为步骤
将步骤求和为结果
最后(返回结果)))
这就是你可以做到的,避免模块化(因为它很昂贵)。您还可以平均步骤2个数字(跳过不需要添加的数字)。

在mod3or5中,0“意外”返回(如果没有value子句,则返回测试值,0为非零,因此为真)。在mod3or5中,0“意外”返回(如果没有value子句,则返回测试值,并且0为非零,因此为真)。