let next_perm a = let n = Array.length a in let i = ref (n - 2) in while !i >= 0 && a.(!i) >= a.(!i + 1) do i := !i - 1 done; if !i < 0 then false else begin let j = ref (n - 1) in while a.(!j) <= a.(!i) do j := !j - 1 done; let t = a.(!i) in a.(!i) <- a.(!j); a.(!j) <- t; let lo = ref (!i + 1) and hi = ref (n - 1) in while !lo < !hi do let t = a.(!lo) in a.(!lo) <- a.(!hi); a.(!hi) <- t; lo := !lo + 1; hi := !hi - 1 done; true end ;; let a = [| 1; 2; 3; 4; 5 |] in let count = ref 0 in while next_perm a do count := !count + 1 done; !count