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

来源:互联网 发布:win7电脑摄像头软件 编辑:程序博客网 时间:2024/06/03 16:10

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

  

阅读全文
0 0
原创粉丝点击