(defun suma (L)
(setq var 0)
(do
((i 0 (+ i 1)))
((= i (length L)))
(+ var (nth i L)))
var)
Why does it always returns 0?
Shouldn't it return sum of list L?
See Question&Answers more detail:os(defun suma (L)
(setq var 0)
(do
((i 0 (+ i 1)))
((= i (length L)))
(+ var (nth i L)))
var)
Why does it always returns 0?
Shouldn't it return sum of list L?
See Question&Answers more detail:os+
does not modify its arguments, so, since you never modify var
, its initial value of 0 is returned.
You need to replace (+ var (nth i L))
with (incf var (nth i L))
, of, equivalently, (setq var (+ var (nth i L)))
.
See incf
.
Note that you should bind var
with let
instead of making it global with setq
.
Most importantly, note that your algorithm is quadratic in the length of the list argument (because nth
scans your list every time from the start).
Here are some better implementations:
(defun sum-1 (l)
(reduce #'+ l))
(defun sum-2 (l)
(loop for x in l sum x))
(defun sum-3 (l)
(let ((sum 0))
(dolist (x l sum)
(incf sum x))))
Here is a bad implementation:
(defun sum-4 (l)
(apply #'+ l))
The problem with sum-4
is that it will fail if the length of the supplied list is larger than call-arguments-limit
.