代码我忘了给出来。这个是计算3111
1311
1131
1113这个行列式的代码,计算其它行列式按例替换掉就OK了。复制内容到剪贴板
代码:
<?php
function swap(&$a,&$b)/*转换数组的下标和数组值的对应关系,以实现排列。*/
{
$temp=$a;
$a=$b;
$b=$temp;
}
function arrange($my_array,$k,$m)/*值数组下标的最后一个值。每层级可以看作,用$k开头,以$m结尾的的新数列,然后排列。*/
{
if($k==$m)/*当$k=$m-1的时候经过一次swap就跳入此分支,把已经排列好的一组排列输出,然后经过跳出swap程序跳出*/
{
for($i=0;$i<=$m;$i++)
{
$temp=$my_array[$i];
$a_arr[$i] = $temp;
}
$GLOBALS['my_value'] += a_value($a_arr,$m);
}
else
{
for($i2=$k;$i2<=$m;$i2++)
{
swap($my_array[$k],$my_array[$i2]);/*把此步骤看成一次从长排列到短排列的楼梯,从一级跳入内部一级时必然经过此次转换。然后生成一个新的排列,也就是除当前层确定的数后面的数组成的排列*/
arrange($my_array,$k+1,$m);/*每一次最外级别的$i值都会经过这里跳入最里层。以$k值的变化控制数组下标的转换。(就不能转变当前这一层所确定最靠前的数)
只能通过后续的for循环改变后面指针的变化.*/
swap($my_array[$k],$my_array[$i2]);/*把此步骤看成一次从长排列到短排列的楼梯,从一级跳入外部部一级时必然经过此次转换。然后生成一个新的排列,也就是除当前层确定的数后面的数组成的排列*/
}
}
}
function a_value($a_arr,$m)
{
$counter=0;
for($i=1;$i<=$m;$i++)
{
for($j=0;$j<$i;$j++)
{
if ($a_arr[$j]>$a_arr[$i])
{
$counter+=1;
}
}
}
$counter%2==0?$flag=1flag=-1;
$a_value=1;
$j=0;
for ($i=0;$i<=$m;$i++)
{
$a_value*=$GLOBALS['u_arrange'][$j][$a_arr[$i]];
$j++;
}
$a_value*=$flag;
return $a_value;
}
$u_arrange[0]=array(3,1,1,1);
$u_arrange[1]=array(1,3,1,1);
$u_arrange[2]=array(1,1,3,1);
$u_arrange[3]=array(1,1,1,3);
global $u_arrange;
global $my_value;
$my_value=0;
$m=count($u_arrange[0])-1;
for($i=0;$i<=$m;$i++)
{
$my_array[$i]=$i;
}
arrange($my_array,0,$m);
echo "\n",$GLOBALS['my_value'];
?>[
本帖最后由 sese53 于 2008-3-22 17:13 编辑 ]