0

私はperlが初めてで、これに関する答えがどこにも見つからないようです。問題を再帰関数に絞り込みました。それをコメントアウトすると、エラーなく正常に動作します。私は持っている:

use strict;
use warnings;

 sub GeneratePermutations{
    my($n, $nMax, $i, $ArrLength, @Arr) = @_;

    if($n == 0){
    foreach($i..$ArrLength-1){
        $Arr[$i] = 0;
        ++$i;
    }

    my @qArr = ();
    my $rVal = 1; 
    for(my $p = 0; $p < @Arr; $p++){

        $rVal *= fac($Arr[$p]);

        for(my $q = 0; $q < $ArrLength; $q++){

        my $qCount = 0; 
        for(my $j = 0; $j < $ArrLength; $j++){ 

            if($Arr[$j] eq $q){
            ++$qCount;
            }


        }
        $qArr[$i] = $qCount;
        }
    }
    my $qVal = 1;
    for(my $qNum = 0; $qNum < @qArr; $qNum++){
        $qVal *= fac($qArr[$qNum]);
    }
    my $maxDistVal = 0;
    $maxDistVal = (1/($ArrLength**$ArrLength))*(fac($ArrLength)/$rVal)*(fac($ArrLength)/$qVal);

    if($maxDistVal > $distribution){
        $distribution = $maxDistVal;
    }
    #prints out distributions for all permutations (comment out previous if-statement)
    print "Dist: " . $distribution . "<br /><br />";
    #return 1;
    }
    my $resultCnt = 0;
    for(my $cnt = MinVal($nMax, $n); $cnt > 0; $cnt--){
    $Arr[$i] = $cnt;
    ++$resultCnt; 
    GeneratePermutations(int($n-$cnt), $cnt, $i+1, $ArrLength, @Arr);
    }

    #return $resultCnt;
    return $distribution;

}

私は何が欠けていますか?

4

3 に答える 3

1

推測する必要がある場合、これが問題だと思います:$qArr[$i] = $qCount;

@qArr に要素を 1 つだけ繰り返し書き込み、後で要素 0 から $#qArr を読み取るためです。

ということ$qArr[$p] = $qCount;ですか?それとも$qArr[$q] = $qCount;

于 2012-07-02T23:04:05.050 に答える
0

$distribution を宣言する場合、再帰全体で永続化する必要があるため、おそらくサブルーチンの外にある必要があります。

于 2012-07-03T02:34:20.937 に答える
0

コードの一部をコメントアウトし始めたところ、この部分を削除すると警告が消えることがわかりました。

for(my $qNum = 0; $qNum < @qArr; $qNum++){
    $qVal *= fac($qArr[$qNum]);
}
于 2012-07-03T21:55:41.773 に答える