Лисп сумма, кратная 3 - PullRequest
       23

Лисп сумма, кратная 3

0 голосов
/ 26 октября 2019

так что я новичок в LISP, и мне было интересно, как я могу найти сумму чисел, которые делятся на 3. Вот что я сделал до сих пор:

(defun sumel (li)

 (cond 
  ((null li) 0)

 ( (zerop (rem (car li) 3))  (+ (car li) (sumel (cdr li))))

 )

)

Небольшой намек на то, чтоЯ делаю неправильно, было бы здорово.

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

Вы передаете случай, когда список пуст и когда вы на самом деле находите кратное 3, но что произойдет, если вам нужно пропустить еще один номер? Вы используете термин по умолчанию, поэтому Common Lisp вернет nil. Например, ваш код работает так:

(defun sumel (li)
 (cond 
  ((null li) 0)
  ((zerop (rem (car li) 3))  
   (+ (car li) (sumel (cdr li))))
  (t nil))) ; when not a multiple of 3 we are finished, return nil

Попробуйте оценить (cond), и вы увидите, что он такой же, как (cond (t nil)).

Вы исправите это, добавив (sumel (cdr l)) в качестве альтернативы. Следует оценить сумму, кратную остальной части списка, что и нужно.

0 голосов
/ 28 октября 2019

Вы также можете использовать другой подход, который использует большую стандартную библиотеку Common Lisp (remove-if-not и reduce в данном случае)

(defun sumel (list)    
    (reduce '+ (remove-if-not (lambda (x) (zerop (rem x 3)))
                              list)))
...