利用静态变量记录并控制递归函数的执行次数
来源:互联网 发布: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
- 利用静态变量记录并控制递归函数的执行次数
- PHP 利用函数的静态变量 指定迭代次数
- 静态局部变量初始化次数的控制
- 递归函数中静态变量的疑惑
- 判断递归执行的次数
- PHP 静态变量 变量函数 递归函数
- 获得函数执行的次数
- java构造函数和静态变量的执行顺序
- Java静态变量和构造函数的执行顺序
- Java静态变量和构造函数的执行顺序
- 子类、父类、静态成员变量,构造函数的执行顺序
- java构造函数和静态变量的执行顺序
- 关于静态变量,静态代码块,实例变量,实例代码块,构造函数的执行顺序
- flex学习记录——控制函数的执行顺序
- 递归函数、全局变量、局部变量、静态变量、常量、指针变量
- 利用HttpSession记录用户的登陆次数
- Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
- Java 静态变量、非静态代码块、构造函数的执行顺序
- JS-异步提交表单的几种方式
- dubbo 的使用
- 从多个表中返回丢失的数据,从sql语句出发
- springmvc整合mybatis
- jsonp介绍与优缺点
- 利用静态变量记录并控制递归函数的执行次数
- 交换两个变量的值,不使用第三个变量的四种方法
- 分析一段H264视频数据
- SpringMVC学习笔记(4)-----访问静态页面
- let's shell---Find 指令用法
- Node.js介绍
- LeetCode 132. Palindrome Partitioning II
- [ZJOI2006]物流运输 (最短路+dp)
- [SDUT](2121)数据结构实验之链表六:有序链表的建立