利用静态变量记录并控制递归函数的执行次数

ぐ巨炮叔叔 提交于 2019-12-01 20:53:29

 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);//将所有的结果合并  
}  

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!