RosettaCodeData/Task/Permutations/Stata/permutations-2.stata

42 lines
541 B
Plaintext

program perm
local n=`1'
local r=1
forv i=1/`n' {
local r=`r'*`i'
}
clear
qui set obs `r'
forv i=1/`n' {
gen p`i'=0
}
mata: genperm()
end
mata
void genperm() {
real scalar n, i, j, k, s, p
real rowvector u
st_view(a=., ., .)
n = cols(a)
u = 1..n
p = 1
do {
a[p++, .] = u
for (i = n; i > 1; i--) {
if (u[i-1] < u[i]) break
}
if (i > 1) {
j = i
k = n
while (j < k) u[(j++, k--)] = u[(k, j)]
s = u[i-1]
for (j = i; u[j] < s; j++) {
}
u[i-1] = u[j]
u[j] = s
}
} while (i > 1)
}
end