SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1103|回复: 3
打印 上一主题 下一主题

求全排列时的循环问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-4-15 09:09:11 | 只看该作者

求全排列时的循环问题

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-7-28 16:45:13 | 只看该作者

Re: 求全排列时的循环问题

关键问题是前面的组合如何全部参与后面的循环。
似乎这种方式很难实现。
思考中,期待中.....
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-7-29 14:31:45 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-8-1 15:02:38 | 只看该作者

Re: 求全排列时的循环问题

太强了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 07:09 , Processed in 0.075274 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表