21 lines
607 B
Racket
21 lines
607 B
Racket
#lang racket
|
|
;; Natural -> Natural
|
|
;; Calculate fibonacci
|
|
(define (fibb n)
|
|
(define (fibb-helper n fibb_n-1 fibb_n-2)
|
|
(if (= 1 n)
|
|
fibb_n-1
|
|
(fibb-helper (sub1 n) (+ fibb_n-1 fibb_n-2) fibb_n-1)))
|
|
(unless (exact-nonnegative-integer? n)
|
|
(raise-argument-error 'fibb "natural" n))
|
|
(if (zero? n) 0 (fibb-helper n 1 0)))
|
|
|
|
;; Unit tests, works in v5.3 and newer
|
|
(module+ test
|
|
(require rackunit)
|
|
(check-exn exn:fail? (lambda () (fibb -2)))
|
|
(check-equal?
|
|
(for/list ([i (in-range 21)]) (fibb i))
|
|
'(0 1 1 2 3 5 8 13 21 34 55 89 144 233
|
|
377 610 987 1597 2584 4181 6765)))
|