fork download
  1. ; local maxima
  2.  
  3. (define (lmax xs)
  4. (if (null? xs) (error 'lmax "empty")
  5. (let loop ((xs (cdr xs)) (prev (car xs)) (dir 'up) (maxs (list)))
  6. (cond ((null? xs)
  7. (reverse (if (equal? dir 'up) (cons prev maxs) maxs)))
  8. ((= prev (car xs)) (loop (cdr xs) prev dir maxs))
  9. ((< prev (car xs)) (loop (cdr xs) (car xs) 'up maxs))
  10. ((equal? dir 'up) (loop (cdr xs) (car xs) 'down (cons prev maxs)))
  11. (else (loop (cdr xs) (car xs) 'down maxs))))))
  12.  
  13. (display (lmax '(1 2 1 2 3 4 3 2 3 2 1))) (newline)
Success #stdin #stdout 0.01s 7888KB
stdin
Standard input is empty
stdout
(2 4 3)