String 什么';我的递归子程序有什么错误?
此子例程使用字母表中从A到第m个字母(长度为N)的字母生成字母的字符串组合String 什么';我的递归子程序有什么错误?,string,perl,loops,recursion,subroutine,String,Perl,Loops,Recursion,Subroutine,此子例程使用字母表中从A到第m个字母(长度为N)的字母生成字母的字符串组合 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++){
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,$n,$str,$letter,$temp,$i)=@;
如果($n==0){
$letter=chr(ord(“A”)+($i+=1));
如果($temp==1){print“$str\n”;}
否则{
对于($j=0;$j
例如:
输入:M=4;N=3;
输出:ABC ABD ACD BCD
我在Ruby中尝试过类似的方法,但在Perl中,它是一个无限循环,我不知道为什么。我是Perl新手。我该怎么办?(如果我的代码有点长,很抱歉)请始终使用
使用strict代码>和使用警告代码>在代码中,尤其是在发布代码和请求帮助时。还始终使用my
声明局部变量
在这种情况下,即使没有尝试过它,我也非常确定像$j
这样的引用全局变量的方法会让您非常头疼——一些使用strict
的方法会让您头疼。默认情况下,变量在perl中是全局变量(尽管使用strict
可以防止未声明和非限定使用它们)。要使递归正常工作,您需要将其中一些设置为词法化,例如,更改:
for($j = 0 ; $j < temp-1 ; $j++){
你的代码很难读懂。我无法理解算法,也看不出子程序中这么多参数的用途,尤其是$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
如果你剪切并粘贴你的实际代码是temp-1
一个打字错误,它会有帮助吗?我应该是$temp-1
,参考Perl中的break
,你很可能想在那里使用last
。请确保你的代码在发布到这里之前可以编译。请参阅perldoc perlrun
,并阅读关于-c开关的内容。
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