Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

how do I average in scheme?

Name: Anonymous 2010-12-26 21:31

im learning scheme and im not very good its my first languages what am i doing wrong

(define (average nums)
   (/ (+ (car nums) (average (cdr nums))) 2))

then i do (average (list 2 3 4 5 6)) but it doesnt work
also how can i do that (average 2 3 4 5 6) gives me the average without doing a list?

please help

Name: Anonymous 2010-12-26 22:16

In Scheme I'd just write:

(define (average . numbers) 
  (/ (apply + numbers) (length numbers)))

(average 1 2 3)
2


If you insist on using recursion even when there are better ways to handle it, you can write:


(define (average . numbers)
  (letrec ((loop
            (lambda (total nrs count)
              (if (null? nrs) (/ total count)
                  (loop (+ total (car nrs)) (cdr nrs) (+ count 1))))))
    (loop 0 numbers 0)))

However, I find the second kind of code kind of long-winded for such simple tasks, but I guess that's why I'm more of a CLer than a Schemer

In CL, I'd just write:

(defun average (&rest numbers)
  (/ (reduce #'+ numbers) (length numbers)))
;; or
(defun average (&rest numbers)
  (/ (loop for n in numbers summing n) (length numbers)))

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List