Lisp,计算奇数

时间:2016-05-22 20:11:44

标签: lisp common-lisp

如何定义数字和字母的列表,但只列出该列表中的奇数?!

(oddsum '(3 6 c 5 82 29 e g) ) => 37 

3 个答案:

答案 0 :(得分:4)

循环:

(loop for ... in ...
      when ...
        sum ...)

使用高阶函数:

(reduce #'+ (remove-if-not (lambda (e) ...) ...))

单个缩减也可以起作用。

答案 1 :(得分:1)

如果你是一个绝对的初学者,也许你还没有研究过很多特殊形式,但我认为你可以知道$http({ method: 'GET', url: '/someUrl' }).then(function successCallback(response) { $scope.instructions = response; }, function errorCallback(response) { }); 一个,其语法为{{ 1}} ...当然你必须知道if

使用(if COND THEN ELSE)defun,我们从定义递归函数defun开始,该函数对数字列表求和,即{ {1}}:if

递归实现意味着我们想要(使用mysum)列表的第一个元素lon与列表的剩余部分(defun mysum (lon) ...)的总和相加: + - 如果有第一个元素,当然......所以我们检查列表是否为空,(car lon),然后是我们已经讨论过的(mysum (cadr lon))子句,最后(+ (car lon) (mysum (cadr lon)))子句,其值必须是空列表中值的总和,即(if lon ...,以便THEN - > ELSE

0

所以,我们已经定义了一个非常简单的函数,因为它运行的列表是同构的,对于非齐次函数,抛出额外的奇怪性,我们必须更加小心并且总和为剩余部分的总和{ {1}}如果(+ last-value (mysum empty-list))不是奇数,或last-value,如果它是奇数,

(defun mysum (lon)
    (if lon
        (+ (car lon) (mysum (cdr lon)))
       0))

答案 2 :(得分:0)

绝对最简单的可能只是使用reduce和辅助函数:

(defun sum-only-odd-numbers (a b)
  (+ a  ;; Previous version checked for oddness here, that is incorrect
     (if (and (integerp b) (oddp b)) b 0))

(reduce #'sum-only-odd-numbers ... :initial-value 0)