位置を指定するとその位置のパスカル三角形の値を返す。再帰で。
sub pascal{
my ($n,$r) = @_;
$n<2?1:$r==0?1:$n==$r?1:pascal($n-1,$r-1)+pascal($n-1,$r);
}
print pascal(0,0);
print "\n";
print pascal(1,0);
print pascal(1,1);
print "\n";
print pascal(2,0);
...
print pascal(4,3);
print pascal(4,4);
print "\n";
三角形
$ perl pascal.pl
1
11
121
1331
14641
この関数を利用して、最小完全ハッシュ関数を。
sub cn {
my @table = @_;
my ($hash,$n,$r) = (0,5,2);
for (my $i=0;$n>$r && $r>0;$i++){
$n--;
$hash += pascal($n,$r--) if ($table[$i]);
}
return $hash;
}
が、「組合せ型の最小完全ハッシュ関数」の逆関数に持っていけなかった。再帰でパスカル三角形を右斜め下から左斜め方向に足していく組み合わせをつくっていって問い合わせの数値になったところのリストを返せばよいと思うんだけど、うまい書き方がみつからなかった。