mendy
mendy

Reputation: 191

Flatten List using Append

I am writing an iterative version of the Pell numbers and I need to print out the output of the numbers in a list. I have done everything right up until the list. Instead of returning a flat list, it returns individual lists of the Pell numbers.

I tried to append all the individual lists but it does not work. What am I missing?

(defun iterPell (n)
  (let ((a 0) (b 1) (c n))
  (loop for i from 2 to n do
  (setq c (+ a (* 2 b))
       a b
       b c))
   c))

(dotimes (n 7)
  (write(append(list(iterPell n))))
)


>>(0)(1)(2)(5)(12)(29)(70)

Upvotes: 0

Views: 151

Answers (1)

Gwang-Jin Kim
Gwang-Jin Kim

Reputation: 10108

(loop for n from 0 to 7
      collect (iterPell n))
;; => (0 1 2 5 12 29 70 169)

(let ((res)) ;; initialize collector = ((res nil))
  (dotimes (n 7) 
     (setf res (cons (iterPell n) res))) ;; setf the result new-value-consed
  (nreverse res)) ;; revert it (after all consing to beginning of list)
;; => (0 1 2 5 12 29 70 169)

;; or write recursive function
(defun apply-on-0-to-n (n func acc)
  (cond ((zerop n) (cons (funcall func 0) acc))
        (t (apply-on-0-to-n (1- n) func (cons (funcall func n) acc)))))

(apply-on-0-to-n 7 #'iterPell '())
;; => (0 1 2 5 12 29 70 169)

Upvotes: 1

Related Questions