; recursion

(define (factorial n)
  (if (zero? n) 1
    (* n (factorial (- n 1)))))

(display (factorial 7)) (newline)

(define (factorial n)
  (let fact ((n n) (result 1))
    (if (zero? n) result
      (fact (- n 1) (* n result)))))

(display (factorial 7)) (newline)

(define (fibonacci n)
  (if (< n 2) 1
    (+ (fibonacci (- n 1))
       (fibonacci (- n 2)))))

(display (fibonacci 7)) (newline)

(define (fibonacci n)
  (let fib ((k 1) (fk 1) (fk-1 1))
    (if (= k n) fk
      (fib (+ k 1) (+ fk fk-1) fk))))

(display (fibonacci 7)) (newline)