racket
[coderacket]
#lang racket
(define (remove-ith lst i)
(if (zero? i)
(cdr lst)
(cons (car lst) (remove-ith (cdr lst) (- i 1)))))
(define (perm lst)
(define (smaller i)
(map (lambda (e) (cons (list-ref lst i) e))
(perm (remove-ith lst i))))
(if (= (length lst) 1)
(list lst)
(foldr append
empty
(map smaller (range (length lst))))))
[/code]
F#
// fsiで#load "foo.fsx";;してください
let rec remove_ith(lst : List, i : int) =
if i = 0 then lst.Tail
else (lst.Head)::(remove_ith(lst.Tail, (i-1)))
let rec perm(lst : List) =
let perm_n(lst : List) =
let smaller(i : int) =
(List.map (fun e -> lst.[i]::e) (perm (remove_ith(lst, i))))
(List.fold (fun x y -> x@y) [] (List.map smaller [0..(lst.Length-1)]))
if lst.Length = 1 then [lst]
else perm_n(lst)