此子程序使用长度为N的字母A到字母M的字母生成字母的字符串组合。
sub genString
{
my($m,$n,$str,$letter,$temp,$i) = @_;
if($n == 0){
$letter = chr(ord("A")+($i+=1));
if($temp == 1){ print "$str\n"; }
else{
for($j = 0 ; $j < temp-1 ; $j++){
if(ord(substr($str,$j,1)) < ord(substr($str,$j+1,1))){$do_print = 1;}
else{
$do_print = 0;
break;
}
}
if($do_print == 1){ print "$str\n"; }
}
}
else{
for($j = ord($letter) ; $j < ord($letter)+$m ; $j++){
genString($m,$n-1,$str.chr($j),$letter,$temp,$i);
}
}
}
&genString($m,$n,$str,"A",$n,0);
实施例: 输入:M = 4; N = 3; 输出:ABC ABD ACD BCD
我在Ruby中尝试过类似的东西并且它可以工作,但是在Perl中,它是一个无限循环,我不知道为什么。我是Perl的新人。我该怎么办? (对不起,如果我的代码有点冗长)
答案 0 :(得分:3)
请始终在代码中使用use strict;
和use warnings;
,尤其是在发布代码和寻求帮助时。也总是使用my
声明局部变量。
在这种情况下,即使没有尝试过,我也很确定像$j
这样的引用全局变量的东西会引起很多麻烦 - use strict
会抓住它。
答案 1 :(得分:3)
默认情况下,变量是perl中的全局变量(尽管use strict
会阻止未声明和非限定使用它们)。为了让你的递归工作,你需要让它们中的一些有词汇,例如,改变:
for($j = 0 ; $j < temp-1 ; $j++){
到
for (my $j = 0; $j < $temp-1; $j++) {
或更好,只是
for my $j (0..$temp-2) {
答案 2 :(得分:1)
您的代码很难阅读。我无法理解算法,我没有看到子程序中有这么多参数的目的,特别是$temp
似乎没有改变,你也没有说它的初始值是什么在最外面的电话中。
使用类似的算法
,此代码似乎可以执行您想要的操作use strict;
use warnings;
genString(4, 3);
sub genString {
my ($m, $n, $str, $i) = @_;
if ($n == 0) {
print $str, "\n";
}
else {
for my $off ($i // 0 .. $m - $n) {
$str //= '';
genString($m, $n-1, $str.chr(ord('A') + $off), $off+1);
}
}
}
<强>输出强>
ABC
ABD
ACD
BCD