-1

このサブルーチンは、A から長さ N のアルファベットの 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 の初心者です。私は何をすべきか?(私のコードがちょっと長い場合は申し訳ありません)

4

3 に答える 3

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) {
于 2012-08-24T19:06:18.453 に答える
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
于 2012-08-24T19:13:54.207 に答える