【问题标题】:Lisp sum of multiples of 3Lisp 3的倍数之和
【发布时间】:2019-10-26 11:23:53
【问题描述】:

所以我是 LISP 的新手,我想知道如何找到可被 3 整除的数字的总和。 这是我到目前为止所做的:

(defun sumel (li)

 (cond 
  ((null li) 0)

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

 )

)

对我做错的事情有一点提示会很棒。

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    当列表为空并且实际找到 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)) 作为替代来解决此问题。它应该评估为列表其余部分的倍数之和,这就是您想要的。

    【讨论】:

      【解决方案2】:

      您还可以采用不同的方法,利用 Common Lisp 的大型标准库(在本例中为 remove-if-notreduce

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多