;Gray Pickney
;CS365
;Homework 10
;#1 (DONE)
(define swap (lambda (a b)
(if(< a b)
(cons a b)
(cons b a))))
;#2 (DONE)
;sum of list
(define sumList (lambda (L)
(cond
((null? L) 0)
(#t (+ (car L) (sumList (cdr L)))))))
;size from L
(define count (lambda (L)
(cond
((null? L) 0)
(#t (+ 1 (count (cdr L)))))))
;average from sum and count
(define avg (lambda (L)
(/ (sumList L) (count L))))
;#3 (DONE)
(define min (lambda (L)
(letrec ((minHelper(lambda (L minThusFar)
(cond
((null? L) minThusFar)
(#t (minHelper (cdr L)
(if (< (car L) minThusFar) (car L) minThusFar)))))))
(cond
((null? L) '())
(else (minHelper L (car L)))))))
;#4 (DONE)
(define merge (lambda (L1 L2)
(cond
((null? L1) L2)
((null? L2) L1)
((< (car L1) (car L2)) (cons (car L1) (merge (cdr L1) L2)))
(else (cons (car L2) (merge L1 (cdr L2)))))))
;mergesortHelper
(define mergesortHelper (lambda (L L1 L2 whichlist?)
(cond
((null? L) (merge (mergesort L1) (mergesort L2)))
((eq? whichlist? 1) (mergesortHelper (cdr L) (cons (car L) L1) L2 (+ whichlist? 1)))
((eq? whichlist? 2) (mergesortHelper (cdr L) L1 (cons (car L) L2) (- whichlist? 1))))))
;mergesort
(define mergesort(lambda (L)
(cond
((null? L) '())
((null? (cdr L)) L)
(else (mergesortHelper L '() '() 1)))))
;#5 (DONE)
;Write a function to return a list containing all elements of a given list
;that satisfy a given predicate. For example
;(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) should return (3 2 4)
(define filter (lambda (pred L)
(cond
((null? L) '())
((pred (car L)) (cons (car L) (filter pred (cdr L))))
(#t (filter pred (cdr L))))))
(display (swap 9 6))
(newline)
(display (sumList '(7 6 9 2)))
(newline)
(display (min '(9 2 1 0)))
(newline)
(display (mergesort '(3 8 5 9 0 2 6)))
(newline)