楼主: zhj7412357
2263 1

【悬赏80论坛币】fcmp过程关于一个排列组合函数的疑问,求教! [推广有奖]

  • 2关注
  • 0粉丝

讲师

8%

还不是VIP/贵宾

-

威望
0
论坛币
662 个
通用积分
0.0523
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1261 点
帖子
157
精华
0
在线时间
439 小时
注册时间
2009-11-15
最后登录
2023-10-29

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
好吧,无人问津,那么帮忙解决了问题。还是无人问津,提高悬赏,送80个论坛币。

下面的程序做5取3的排列组合过程,取值是3个,2个0. 哪位朋友能麻烦解答下这个程序是怎么完成各个组合的计算的呢。这个是help文档里的事例
  1. proc fcmp outlib=sasuser.funcs.math;
  2.    subroutine allpermk(n, k);
  3.       array scratch[1] / nosymbols;
  4.       call dynamic_array(scratch, n);
  5.       call permk(n, k, scratch, 1, 0);
  6.    endsub;

  7. subroutine permk(n, k, scratch[*], m, i);
  8.    outargs scratch;
  9.    if m-1 = n then do;
  10.       if i = k then
  11.          put scratch[*];
  12.       end;
  13.    else do;
  14.       scratch[m] = 1;
  15.       call permk(n, k, scratch, m+1, i+1);
  16.       scratch[m] = 0;
  17.       call permk(n, k, scratch, m+1, i);
  18.    end;
  19. endsub;
  20. run;
  21. quit;

  22. options cmplib=sasuser.funcs;
  23. data _null_;
  24.    call allpermk(5, 3);
  25. run;
  26. Log Output from Recursion Example
  27. 1 1 1 0 0
  28. 1 1 0 1 0
  29. 1 1 0 0 1
  30. 1 0 1 1 0
  31. 1 0 1 0 1
  32. 1 0 0 1 1
  33. 0 1 1 1 0
  34. 0 1 1 0 1
  35. 0 1 0 1 1
  36. 0 0 1 1 1
复制代码


还有在:   
scratch[m] = 1;     
call permk(n, k, scratch, m+1, i+1);


这个部分,难道是一直进行循环到m-1=n?这样scratch都取值是1了么?可是这个时候i=k也不成立啊,那怎么输出scratch?各位帮帮忙解释一下吧
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:0论坛币 FCMP 论坛币 FCM CMP scratch 朋友 程序

有一天,建一所学校,告诉以后的孩子们,思想还可以飞翔、追寻自由,道德仍然可以修养、高尚。
沙发
playmore 发表于 2014-6-23 09:20:44 |只看作者 |坛友微信交流群
permk子过程的m用于标记当前循环所处scratch的位置,初始值为1,到n+1时结束,i用于记录scratch中1的数目。

开始循环时,m=1,i=0,进入else部分,scratch[1]=1,然后再call permk(5,3,scratch,2,1),这时就进入了递归的第二重循环,这时scratch[2]=1,然后再call permk(5,3,scratch,3,2),...,直到m=6为止,此时scratch里面有五个1,i=5,不满足i=3的条件,所以不输出

这时循环开始逐个跳出第一个call permk,进入下一个call permk,即逐步为scratch由后向前把1换0,.....

说了这么多我都晕了,简单说来就是遍历一个5位的2进制数的所有可能,然后每一位上的1相加之和等于3才输出。如果想更直观些,只要把if i=k then那一行注释掉,然后看看程序输出些什么就好了

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 11:52