编写一个COUNT-NUMBERS函数来计算列表中的数字

时间:2017-04-15 13:59:01

标签: lisp

我是LISP的乞丐,我有一个问题需要你的帮助。

编写一个COUNT-NUMBERS函数,用于计算列表中的数字数,然后返回"没有号码"如果列表中没有数字

例如,对于列表:(A 2.3 B C 4 5),它返回3.

我已尝试使用以下代码,但它无法正常工作。你能帮我解决一下吗?此外,我不知道如何返回" NO NUMBER"如果列表中没有数字。

pd.crosstab(df.tags, df.date, df.ease == 1, aggfunc="sum").fillna(0)

# date  'date1' 'date2'
# tags      
#'tag1'   2.0   1.0
#'tag2'   0.0   1.0
#'tag3'   0.0   1.0

提前致谢,

2 个答案:

答案 0 :(得分:1)

你可以定义一个内部辅助函数来进行计数,并检查结果以决定在main函数中返回什么:

(defun number-counter (lst)
  (labels ((do-count (l)
                 (cond ((null l) 0)
                       ((numberp (car l)) (+ 1 (do-count (cdr l))))
                       (t (do-count (cdr l))))))
    (let ((r (do-count lst)))
      (if (= r 0) 'NO-NUMBER r))))

答案 1 :(得分:1)

这将是一个尾递归版本。不知何故,你必须检查返回什么。

(defun count-numbers (list &optional (n 'no-number))
  (cond ((null list) n)
        ((numberp (first list))
         (count-numbers (rest list)
                        (if (eq n 'no-number)
                            1
                          (1+ n))))
        (t (count-numbers (rest list) n))))

使用LOOP,您可以这样写:

(defun count-numbers (list)
  (loop for element in list
        count (numberp element) into n
        finally (return (if (zerop n) 'no-number n))))