(define largest-in-list (lambda (ls) (if (null? ls) (errorf 'largest-in-list "list cannot be empty") (largest-in-non-empty ls)))) (define largest-in-non-empty (lambda (ls) (if (null? (cdr ls)) (car ls) (let ([largest-in-cdr (largest-in-non-empty (cdr ls))]) (if (> (car ls) largest-in-cdr) (car ls) largest-in-cdr))))) (largest-in-list '()) (largest-in-list '(3 1 4 2)) (largest-in-list '(5 1 4 2)) (largest-in-list '(5 1 4 7)) (largest-in-list '(7)) (largest-in-list '(3 4 a)) ; not the greatest error message. Fix that in next version. ; Now define another version with an accumulator (that is also more robust) (define largest-in-list (lambda (ls) (if (null? ls) (errorf 'largest-in-list "list cannot be empty") (largest-in-list-acc (cdr ls) (car ls))))) ; cond is like if ... else if ... else (define largest-in-list-acc (lambda (ls largest-so-far) (cond [(null? ls) largest-so-far] [(not (number? (car ls))) (errorf 'largest-in-list "everything in the list must be a number")] [(> (car ls) largest-so-far) (largest-in-list-acc (cdr ls) (car ls))] [else (largest-in-list-acc (cdr ls) largest-so-far)])))