(define for (lambda (count final body accum) (if (> count final) accum (for (+ count 1) final body (body accum count))))) (define sum (lambda (n) (for 1 n (lambda (sum i) (+ i sum)) 0))) (define first car) (define second cadr) (define (fast-fibo n) (first (for 1 n (lambda (accum i) (list (+ (first accum) (second accum)) (first accum))) (list 0 1)))) (define genfor (lambda (count test inc body accum) (if (not (test count)) accum (genfor (inc count) test inc body (body accum count))))) (define (fast-fibo-gen n) (first (genfor 1 ; initial iteration value (lambda (i) (<= i n)) ; test - if it evaluates to true when applied to current iteration value, keep going (lambda (i) (+ i 1)) ; increment function - how to get the next iteration value (lambda (accum i) (list (+ (first accum) (second accum)) (first accum))) (list 0 1))))