SAS中文论坛
标题:
求全排列时的循环问题
[打印本页]
作者:
shiyiming
时间:
2007-4-15 09:09
标题:
求全排列时的循环问题
sasor上有个求10个数字的全排列的问题,我的想法是下面的代码执行后,r9变量就会有需要生成的全部排列。但结果却不是:(。想法是这样的,从数字0开始,加入1后应该有01、10两个排列;加入2后应该有201、021、012、210、120、102六个排列;加入3后会有24个排列(每个三位数的数字,有4个空挡可插入4,对应4个四位数的排列,四六二十四个)。。。。。。,一直如此,直到加入数字9后,就可以产生全部的10的阶乘个排列。也是按照排列的原始定义思路来做的。
但是下面的代码执行后,从10、01开始后,循环至数字2时,只生成了01对应的201、021、012三个排列不是六个;到数字3时,只生成了012再加上3对应的4个排列不是二十四个;到最后,r9只有012345678加上9对应的10个排列。为什么循环少了呢?谢谢。
并且类似这种需要遍历某些观测来循环的普遍需求,怎么解决。java等语言中,提供collection等集合来实现,sas该怎么实现呢?
[code:47c58]data permute;
format str $ 10.;
array r(9) $ 10. r1-r9;
do i=1 to dim(r);
if i=1 then do;
len=1;
str='0';
end;
else do;
len=length(r(i-1));
str=r(i-1);
end;
do j=1 to len+1;
if j=1 then r(i)=put(i,$1.)||trim(str);
else if j=len+1 then r(i)=trim(str)||put(i,$1.);
else r(i)=substr(str,1,j-1)||put(i,$1.)||substr(str,j);
output;
end;
end;
run; [/code:47c58]
作者:
shiyiming
时间:
2007-7-28 16:45
标题:
Re: 求全排列时的循环问题
关键问题是前面的组合如何全部参与后面的循环。
似乎这种方式很难实现。
思考中,期待中.....
作者:
shiyiming
时间:
2007-7-29 14:31
标题:
Re: 求全排列时的循环问题
想要全排列到第几位数,把num换成那个数就可以:
[code:9fc15]%macro tem(num);
%do j=0 %to &num.;
%if &j.=0 %then %do;
data temp&j.;
var&j.=0;
output;
run;
%end;
%else %do;
%let k=%eval(&j.-1);
data temp&j.( keep=
%if &j.=&num. %then %do;
var&j.
%end;
%else %do;
var&j. var&k.
%end;);
set temp&k.;
length var&j. $10.;
len=length(trim(left(var&k.)));
do i=0 to len;
if i=0 then do;
var&j.="&j."||trim(left(var&k.));
output;
end;
else if i=len then do;
var&j.=trim(left(var&k.))||"&j.";
output;
end;
else do;
var&j.=substr(left(var&k.),1,i)||"&j."||substr(left(var&k.),i+1);
output;
end;
end;
run;
%end;
%end;
%let k=%eval(&j.-2);
proc datasets lib=work;
delete %do i=0 %to &k.;
temp&i.
%end;;
run;
%mend tem;
%tem(9)
[/code:9fc15]
作者:
shiyiming
时间:
2007-8-1 15:02
标题:
Re: 求全排列时的循环问题
太强了!
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2