(define len (lambda (lst) (if (null? lst) 0 (+ 1 (len (cdr lst)))))) ;; (foldr f base (list x-1 ... x-n)) = (f x-1 ... (f x-n base)) ;; (foldl f base (list x-1 ... x-n)) = (f x-n ... (f x-1 base)) (define flen (lambda (lst) (foldl (lambda (_ n) (+ n 1)) 0 lst))) ;; recursive factorial (define fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))) ;; enumerate a list from n downto 1 (define enumerate (lambda (n) (if (= 0 n) '() (cons n (enumerate (- n 1))) ))) ;; folded factorial (define ffact (lambda (n) (foldl * 1 (enumerate n))))