; three more homework problems

(define (adjoin x xs)
  (if (member x xs) xs (cons x xs)))

(define (problem1 xs)
  (let loop ((xs xs) (zs (list)))
    (if (null? xs) zs
      (loop (cdr xs) (adjoin (car xs) zs)))))

(display (problem1 '(3 2 4 2 7 3 5 1 3))) (newline)

(define (problem2 xs ys)
  (let loop ((xs xs) (ys ys) (zs (list)))
    (cond ((or (null? xs) (null? ys))
            (reverse zs))
          ((< (car xs) (car ys))
            (loop (cdr xs) ys zs))
          ((< (car ys) (car xs))
            (loop xs (cdr ys) zs))
          (else (loop (cdr xs) (cdr ys)
                      (cons (car xs) zs))))))

(display (problem2 '(2 3 5 5 6 7 8 9) '(1 2 4 5 5 7))) (newline)

(define (iroot k n)
  (let ((k-1 (- k 1)))
    (let loop ((u n) (s (+ n 1)))
      (if (<= s u) s
        (loop (quotient (+ (* k-1 u) (quotient n (expt u k-1))) k) u)))))

(define (problem3 n)
  (let ((n3 (iroot 3 n)))
    (= (* n3 n3 n3) n)))

(display (problem3 125)) (newline)
(display (problem3 121)) (newline)