#lang racket ;; CSE 413 Au12 lecture 4 sample code ;; return list with lst1 followed by lst2 (define (app lst1 lst2) (if (null? lst1) lst2 (cons (car lst1) (app (cdr lst1) lst2)))) ;; return two reversed copies of lst appended together (define (rev2 lst) (append (reverse lst) (reverse lst))) ;; let expressions ;; same as rev2, but only evaluates (reverse lst) once (define (r2faster lst) (let ((r (reverse lst))) (append r r))) ;; reverse a list (wrong) (define (revbug lst) (if (null? lst) '() (cons (revbug (cdr lst)) (car lst)))) ;; reverse a list (correct, but O(n^2)) (define (revbetter lst) (if (null? lst) '() (append (revbetter (cdr lst)) (list (car lst))))) ;; reverse lst using tail recursion in O(n) time (define (revt lst) (revaux lst '())) ;; Return (reverse rest) appended to front of result (define (revaux rest result) (if (null? rest) result (revaux (cdr rest) (cons (car rest) result)))) ;; n! (define (fact n) (if (< n 2) 1 (* n (fact (- n 1))))) ;; n! tail recursive (define (factt n) (factaux n 1)) (define (factaux n acc) (if (< n 2) acc (factaux (- n 1) (* n acc))))