免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6082 | 回复: 16
打印 上一主题 下一主题

foreach循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-05 18:35 |只看该作者 |倒序浏览
大家好:
我想输出所有长20个字母的字符串,只能为a,b,c和d,其中a、b、c的总数小于等于7。以下foreach循环脚本哪里有误?谢谢!
  1. #!/usr/bin/perl

  2. @a = (a,b,c,d);
  3. $x='';

  4. for $i1 (@a){
  5. $x .= $i1;
  6. for $i2 (@a){
  7. $X .= $i2;
  8. for $i3 (@a){
  9. $x .= $i3;
  10. for $i4 (@a){
  11. $x .= $i4;
  12. for $i5 (@a){
  13. $x .= $i5;
  14. for $i6 (@a){
  15. $x .= $i6;
  16. for $i7 (@a){
  17. $x .= $i7;
  18. for $i8 (@a){
  19. $x .= $i8; $no = &abc($x); next if $no > 7;
  20. for $i9 (@a){
  21. $x .= $i9; $no = &abc($x); next if $no > 7;
  22. for $i10 (@a){
  23. $x .= $i10; $no = &abc($x); next if $no > 7;
  24. for $i11 (@a){
  25. $x .= $i11; $no = &abc($x); next if $no > 7;
  26. for $i12 (@a){
  27. $x .= $i12; $no = &abc($x); next if $no > 7;
  28. for $i13 (@a){
  29. $x .= $i13; $no = &abc($x); next if $no > 7;
  30. for $i14 (@a){
  31. $x .= $i14; $no = &abc($x); next if $no > 7;
  32. for $i15 (@a){
  33. $x .= $i15; $no = &abc($x); next if $no > 7;
  34. for $i16 (@a){
  35. $x .= $i16; $no = &abc($x); next if $no > 7;
  36. for $i17 (@a){
  37. $x .= $i17; $no = &abc($x); next if $no > 7;
  38. for $i18 (@a){
  39. $x .= $i18; $no = &abc($x); next if $no > 7;
  40. for $i19 (@a){
  41. $x .= $i19; $no = &abc($x); next if $no > 7;
  42. for $i20 (@a){
  43. $x .= $i20; $no = &abc($x); next if $no > 7;
  44. print "$x\n";
  45. }}}}}}}}}}}}}}}}}}}}    #20 brackets

  46. sub abc
  47. {
  48. $string = shift;
  49. @string = split//, $string;
  50. for $elem (@string){
  51. if ($elem eq 'a') {$ha{$elem} +=1}
  52. elsif ($elem eq 'b') {$hb{$elem} += 1}
  53. elsif ($elem eq 'c') {$hc{$elem} += 1}
  54. elsif ($elem eq 'd') {$hd{$elem} += 1}
  55. }

  56. return $ha{'a'}+$hb{'b'}+$hc{'c'};
  57. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-07-05 23:39 |只看该作者
写这种程序是为了好玩吗?

论坛徽章:
0
3 [报告]
发表于 2014-07-05 23:43 |只看该作者
不是的,其实我上面只举了个例子,我主要是做基因分析的。我的perl水平非常有限,所以请高手指点。谢谢!

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
4 [报告]
发表于 2014-07-06 15:04 |只看该作者
这代码好暗黑啊。。。

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
5 [报告]
发表于 2014-07-06 18:53 |只看该作者
你还是写出需求 重新写吧··· 这个真心没法看···

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2014-07-06 18:56 |只看该作者
哈哈,典型的把自己绕进去的算法。就是排列组合。

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
7 [报告]
发表于 2014-07-06 23:09 |只看该作者
本帖最后由 stanley_tam 于 2014-07-06 23:50 编辑

代码重复的略多哦。
把a b c d分别当作4进制里的0,1,2,3。 那么问题就变成了从4进制数0一直数到'3' x 20。不知道对不对。。。{:3_188:}
可以用模块Math::Base::Convert,它把4进制数弄成了 用字符表示的dna进制  => a c t g。可以把dna进制替换成abcd
a、b、c的总数小于等于7,那就是d的数量大于等于13个咯
没时间跑完,你试下。{:3_204:}
  1. #!perl
  2. use Modern::perl;
  3. use FileHandle;
  4. use Math::Base::Convert qw{ cnv };

  5. sub count_d;
  6. sub main;

  7. main;

  8. sub main {
  9.     my $number = 0;
  10.     my $out_fh = FileHandle->new('out.txt', 'w');

  11.     while (1) {
  12.         $number++;
  13.         my $converted = cnv($number, 10 => ['a', 'b', 'c', 'd']); # convert to string like aaaaaaaaaaaaaabdbdcd

  14.         my $len = length $converted;
  15.         if ( $len < 20) {
  16.             # body...
  17.             $converted = 'a' x (20-$len) . $converted;
  18.         }
  19.         elsif ($len > 20){
  20.             last
  21.         }

  22.         my $d_num = count_d($converted);
  23.         if ($d_num >= 13) {
  24.             $out_fh->print("$converted\n");
  25.         }
  26.     }

  27.     close $out_fh;
  28. }

  29. sub count_d {
  30.     my $str   = shift;
  31.     my $g_num = 0;

  32.     for my $i ( unpack("U*", $str)){
  33.         $g_num++ if $i == 100;  # ord('d') => 100
  34.     }

  35.     return $g_num;
  36. }

  37. __END__
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-07-07 15:41 |只看该作者
本帖最后由 afukada 于 2014-07-07 15:47 编辑

回复 1# pony2001mx


先對結果做預估

a+b+c=0:

N_0=C(20,0) * 3^0 = 1 * 1 = 1

a+b+c=1:

N_1=C(20,1) * 3^1 = 20 * 3 = 60

...

所以可以得到當a+b+c=n:

N_n=C(20,n) * 3^n

把結果列表出來:

a+b+c N_n
0 1
1 60
2 1710
3 30780
4 392445
5 3767472
6 28256040
7 169536240
Total 201984748


可以檢查一下 (希望沒有算錯)

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
9 [报告]
发表于 2014-07-08 14:51 |只看该作者
回复 3# pony2001mx


    这样写,你确定你跑生物大数据没把pc跑死麽。。。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
10 [报告]
发表于 2014-07-08 16:04 |只看该作者
本帖最后由 huang6894 于 2014-07-08 16:06 编辑

以下代码,我把电脑跑死了~
4^20 = 1 099 511 627 776
  1. my @out;
  2. sub X {
  3.     @_ ? map { my $h = $_; map [ $h, @$_ ], X(@_) } @{ +shift } : [];
  4.     }
  5.     my @A = ([ A,T,C,G ]) x 20;
  6.     push @out,"@$_" for X @A;
  7.     for my $i (@out){
  8.             my $count = 0;
  9.             ++$count while($i =~ m/G/g);
  10.             print "$i\n" if $count > 13;
  11.     }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP