0

リスト内の数値を取得して合計を求める再帰的メソッドを LISP で作成する必要があります。リスト内の数値でないものはすべてスキップされます (たとえば、リストに「チーズ 12 犬 8 靴 5」が含まれている場合、出力は 25 になります)。

現在、私のコードは合計を見つけていますが、リストに数値ではないものがあればエラーをスローします。それを修正するために何を変更できますか?

(defun adder (lis)
   (cond
    ((null lis) 0)
    (t (eval (cons '+ lis)) )
  )
)
4

2 に答える 2

2

長くなる可能性のあるリストで使用applyするのは少し危険です。リストが よりも長い場合call-arguments-limit、機能し(apply '+ list)ません。現在、call-arguments-limitは通常、現代の Lisp ではかなり大きいですが、50 まで小さくすることができます。これに関する詳細については、以下を参照してください。

あなたの最善の策reduce '+ listは、各数値をそれ自体に、各非数値を に取るキー関数で使用することだと思います0。(この重要な機能はabiessu がコメントで言及したものです。)

(reduce '+ list :key (lambda (x) (if (numberp x) x 0)))
CL-USER> (let ((list '(cheese 12 dog 8 shoe 5)))
           (reduce '+ list :key (lambda (x) (if (numberp x) x 0))))
25
CL-USER> (let ((list '()))
           (reduce '+ list :key (lambda (x) (if (numberp x) x 0))))
0

より複雑なキー関数を使用する代わりに、非数値 (または)(remove-if-not 'numberp list)を取り除くために使用することもできます。(remove-if (complement 'numberp) list)

CL-USER> (let ((list '(cheese 12 dog 8 shoe 5)))
           (reduce '+ (remove-if-not 'numberp list)))
25
CL-USER> (let ((list '()))
           (reduce '+ (remove-if-not 'numberp list)))
0
于 2013-11-12T18:33:30.277 に答える