Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 什么';我的递归子程序有什么错误?_String_Perl_Loops_Recursion_Subroutine - Fatal编程技术网

String 什么';我的递归子程序有什么错误?

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++){

此子例程使用字母表中从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++){
             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