0

私はプロジェクトオイラーの問題を試し、一般的なlispを学習しようとしていますが、かなり早い段階で立ち往生しています。問題1では、問題は1から1000までの整数の合計です。以下のコードでそれを実行する必要があると思いますが、代わりに常にend(mod3またはmod5の場合)または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)ます。conditiontrueの場合、すべての式を評価し、の値を返しますexpnconditionfalseの場合、次のフォームに進みます。

最後の形式は次のとおり(+ (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

loop以前に投稿したことがありますが、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)))

これは、モジュロ処理を回避して、それを行う方法です(高価であるため)。また、平均して2つの数値をステップ実行します(追加する必要のない数値はスキップします)。

于 2013-01-06T23:11:00.567 に答える