(define (permute n p) (letrec ( (make-list (lambda (n) (if (zero? n) '() (cons n (make-list (- n 1)))))) (lremove-iterator (lambda (index input-list reversed-output-list) (if (zero? index) (append (reverse reversed-output-list) (cdr input-list)) (lremove-iterator (- index 1) (cdr input-list) (cons (car input-list) reversed-output-list))))) (lremove (lambda (list index) (lremove-iterator index list '()))) (lindex (lambda (list index) (if (zero? index) (car list) (lindex (cdr list) (- index 1))))) (permute-iterator (lambda (n p input-list output-list) (if (zero? n) output-list (let ((index (remainder p n))) (permute-iterator (- n 1) (quotient p n) (lremove input-list index) (cons (lindex input-list index) output-list))))))) (permute-iterator n p (make-list n) '())))