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