0

我正在尝试项目 euler 问题来学习常见的 lisp,但我很早就被困住了。关于问题 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。

4

2 回答 2

5

给定的每个表格cond都有表格(condition exp1 ... expn)。如果condition为真,它将评估所有表达式并返回 的值expn。如果condition为假,它将继续下一个表格。

你的最后一个表格是这样的:(+ (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)))
于 2013-01-06T22:26:43.483 回答
0

我之前发布过这个,但它是在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)))

这就是你可以做到的方式,避免取模(因为它很昂贵)。您还将平均步 2 个数字(跳过那些您不必添加的数字)。

于 2013-01-06T23:11:00.567 回答