static关键字
在PHP的函数内部中,当我们定义一个static变量时,需要对该变量进行初始化赋值且仅初始化一次,由于static修饰的变量是局部的,该变量仅在函数内部有效,当每次调用该函数时,该变量的值都会保留。
利用这一特性,可以统计出递归函数的调用次数,并可以做限制,防止未收敛的递归函数无限执行下去,造成死循环。
下面可以通过递归方法常用的 求斐波那契数列 与 快速排序 做演示:
斐波那契数列
$num = 10;
echo "fibonacciSequence($num)的值为:".fibonacciSequence($num);
echo PHP_EOL;
function fibonacciSequence($num)
{
$limitCount = 1000;
static $executeCount = 0;
$executeCount++;//static变量在函数内完成初始化后,每次执行该函数变量值都会保留,利用这一特性可以记录函数调用次数
echo "函数".__METHOD__."已递归执行{$executeCount}次;".PHP_EOL;
if($executeCount < $limitCount)//递归执行次数未超过函数限定次数方可继续递归下去
{
if($num == 1)
{
return 1;
}
else if($num == 2)
{
return 1;
}
else
{
return fibonacciSequence($num - 1) + fibonacciSequence($num - 2);
}
}
else
{
exit("函数".__METHOD__."已递归执行{$executeCount}次,超过限定次数不可再执行。".PHP_EOL);
}
}
快速排序$disorder = array();
for($i = 0 ; $i<10 ; $i++){
$disorder[$i] = rand(1,100);//随机取10个1-100的数字组成一个待排数列
}
echo "待排序的数列为:".implode(',',$disorder);
echo PHP_EOL;
$sortArray = quickSort($disorder);
echo PHP_EOL;
echo PHP_EOL;
echo "最终的排序结果为:".implode(',',$sortArray);
echo PHP_EOL;
function quickSort($disorder)
{
static $executeCount = 0;
$executeCount++;
echo PHP_EOL;
echo "第{$executeCount}次递归执行,";
echo "待排数列为:".implode(',',$disorder).";";
if(!is_array($disorder)) return false;//判断参数是否是一个数组
$length=count($disorder);
if($length <= 1) return $disorder;//递归出口:数组长度为1,直接返回数组
$left = array();
$right = array();
$flagNumber = $disorder[0];//取待排数组的首个数字作为标杆
for($i=1;$i<$length;$i++)
{
if($disorder[$i] < $flagNumber)
{
$left[] = $disorder[$i];//将所有比标杆小的数字,放置标杆左边
}
else
{
$right[] = $disorder[$i];//将所有比标杆大的数字,放置标杆右边
}
}
echo '排序结果:{'.implode(',',$left).'},'.$flagNumber.',{'.implode(',',$right).'};';
$left = quickSort($left);//继续递归调用左半部分的待排数组
$right = quickSort($right);
return array_merge($left,array($flagNumber),$right);//将所有的结果合并
}
来源:CSDN
作者:太极宗师老顽童
链接:https://blog.csdn.net/u012393450/article/details/78105474