我想写一个奇怪的函数,所以请容忍我此函数应以listL
作为参数,并具有一个sum
变量如果L
不是列表,则应返回nil
否则,它应该遍历列表中的每个元素并执行以下操作:
如果元素是一个小于零的数字,它应该从和中减去1。
如果元素是一个大于零的数字,它应该在和上加1。
如果元素是0或不是数字,则应将0添加到和中。
下面是我的代码,但不管传入的参数如何,它都返回0:
(defun sigsum (L)
(let ((sum 0)) ;;variable sum
(if (not (listp L)) ;;if L is not a list
nil ;;return nil
(dotimes (i (length L)) ;;otherwise loop through L
(if (numberp (elt L i)) ;;if each element is a number
(if (< (elt L i) 0) ;;if is less than 0 subtract 1 from sum
(- sum 1)
(if (> (elt L i) 0) ;;if greater than 0 add 1 to sum
(+ sum 1))
(+ sum 0)) ;;else add 0 to sum
(+ sum 0))) ;;not a number so add 0 to sum
)
sum) ;;return sum
)
一如既往,我们非常感谢您的帮助。
最佳答案
(defun discrete (lis)
(cond
((and (listp lis) (not (equal lis nil)))
(let ((sum 0))
(loop for item in lis do
(cond ((or (not (numberp item)) (equal 0 item)) t)
((and (numberp item) (> item 1)) (setf sum (+ 1 sum)))
((and (numberp item) (< item 1)) (setf sum (- sum 1)))))
sum))))
用法:
(discrete '(-1 2 3 0 2 2 -1 2 34 0 -1))
=>3(discrete '(-4 a b))
=>-1个(discrete '())
=>无(discrete '(a s d f))
=>0