递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来终止递归。

一:使用参数引用完成递归函数。操作的是同一块内存地址。

<?php
$i=1;
function test(&$i)
{
echo $i;
$i++;
if ($i < 10){
test($i);
}
}
test($i);//输出123456789
test($i);//输出10 ?>

二:使用全局变量完成递归函数。在函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。例子中,test()函数内部的 $i 实际上只是程序第一行中($i = 1;)的变量 $i 的一个应用;

<?php
$i = 1;
function test()
{
global $i;
echo $i;
$i++;
if ($i < 10){
test();
}
}
test();//输出123456789
test();//输出10 ?>

三:使用静态变量完成递归函数。static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值。

<?php
function test()
{
static $i = 1;
echo $i;
  $i++;
if ($i < 10) {
test();
}
$i--;//在每一层递归结束时自减,这一句可以帮助理解递归函数的执行过程
}
test();//输出123456789
test();//输出123456789
?>

例1. 使用全局变量的情况递归遍历文件夹下的所有文件 

function getFiles($dir)
{
global $arr; //引用全局变量
if(is_dir($dir)){
$handle = @opendir($dir);
while($file=readdir($handle)){
if(!in_array($file,array('.', '..'))){
$dirr = $dir.'/'.$file;
if(is_dir($dirr)){
getFiles($dirr); //递归读子目录
}else{
array_push($arr, $dirr);
}
}
}
}
}
$arr = array(); //必须先定义全局变量
getFiles('E:/logs');
print_r($arr); 

例2:使用静态变量的情况递归遍历文件夹下的所有文件

function getFiles ($dir)
{
static $arr = array(); //使用静态变量,防止每次递归都被覆盖
if(is_dir($dir)){
$handle = opendir($dir);
while($file=readdir($handle)){
if(!in_array($file,array('.','..'))){
$dirr = $dir."/".$file;
if(is_dir($dirr)){
getFiles ($dirr);
}else{
array_push($arr,$dirr);
}
}
}
}
return $arr;
}
$rows= array();
$rows = getFiles ('E:/logs');
print_r($rows);

例3:使用 glob() 函数或者 scandir() 函数的情况递归遍历文件夹下的所有文件

function getFiles($dir)
{
static $arr = array(); //使用静态变量,防止每次递归都被覆盖
if(is_dir($dir)){
$handle = glob("$dir/*");
//或者使用scandir() 函数,该函数的作用与 glob() 函数相同
    //$handle = scandir($dir);
foreach($handle as $filename){
if(is_dir($filename)){
getFiles($filename);
}else{
array_push($arr,$filename);
}
}
}
return $arr;
}
$rows= array();
$rows = getFiles ('E:/logs');
print_r($rows);

当然使用glob()函数,还可以定义自获取某类文件,比如只获取 txt文件:glob("$dir/*.txt");

例4:利用递归来执行轮询操作

//轮询3次,进程需要驻守内存
function getCheck($check='要处理的参数',$times = 1)
{
if(!$check){
return 'param error';
}
$url = "https://www.xxxx.com/test.php";
$re = file_get_contents($url);
if($re == 'error'){
$time = time();
echo date('Y-m-d H:i:s',$time).':'.$re.$times."<br>";
$times ++;
if($times<4){
sleep(1);
return getCheck($check,$times);
}else{
return 'time out';
}
}else{
return 'success';
}
}

PHP中递归的实现(附例子)的更多相关文章

  1. NET中MSMQ的使用----附例子

    目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子   一. ...

  2. java中递归的用法和例子

    递归   直接或者间接调用自己, public class Test{    public static void main(String[] args){        int i = 5;    ...

  3. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  4. ASE存储过程和IQ存储过程的常见区别(附例子)

    ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在S ...

  5. Javascript中递归造成的堆栈溢出及解决方案

    关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...

  6. 我教女朋友学编程html系列(5) html中table的用法和例子

    女朋友不是学计算机的,但是现在从事计算机行业,做技术支持,她想学习编程,因此我打算每天教她一点点,日积月累,带她学习编程,如果其他初学者感兴趣,可以跟着学. 为了将table介绍的简单.生动,具有实战 ...

  7. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  8. C++ 中递归实现 二项式展开式(a+b)^ n 的表达式

    C++ 中递归实现 二项式展开式 的表达式 前几天,一个数学系读研的同学来问有什么软件可以来求 (a+b)^n 这种表达式类型的展开式,我随口一说了 Octave , 毕竟这个开源的还是可以的,后来他 ...

  9. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  10. 【ABAP系列】SAP ABAP中ALV使用HTML的例子

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中ALV使用HT ...

随机推荐

  1. u-boot-2018-09 分析 v1

    下载地址: https://pan.baidu.com/s/1YcQ1XpFyzmNcr1afw1RhgQ 或者:

  2. 记录使用yum安装nginx之后的目录问题

    一般来说我们安装nginx的目录都是/usr/local/nginx的,但是用yum安装的目录跟手动安装的不一样,下面是整理的使用yum安装的一些对应目录. nginx执行文件目录:/usr/sbin ...

  3. Visual Studio 2015 update 3各版本下载地址

    微软在06月27日发布了Visual Studio 2015 Update 3 .在MSDN中微软也提供下载,而且MSDN的Visual Studio 2015 Update 3与官方免费下载的文件是 ...

  4. 自然语言处理中的N-Gram模型

    N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理.另外一方面,N-Gram的另外一个作用是 ...

  5. Java之Servlet

    Servlet规范了JavaWeb项目的结构Servlet的规范约束了服务器如何来实现Servlet规范,如何解析JavaWeb项目的结构. Java就是通过接口来约束 Servlet规范的jar就在 ...

  6. android4.2 telephone应用层分析

    InCallScreen.java 复制通话界面的显示和提供人机交互的接口.进入该界面第一个调用ONCreate.否则进入OnNewIntent,该配置文件是incall_screen.xml,当中i ...

  7. 如何在Mac的Finder中显示/usr,/tmp,/var等隐藏目录

    在终端里输入下面命令即可让它们显示出来. defaults write com.apple.finder AppleShowAllFiles -bool true 如果想恢复隐藏,可以用这个命令: d ...

  8. Fluent动网格【12】:扩散光顺

    扩散光顺是Fluent提供的另外一种常用的网格光顺方法.其基本原理是通过求解扩散方程得到网格节点的运动位移. 扩散光顺基本计算 扩散光顺通过求解 以下扩散方程来设置网格的节点位置. \[ \nabla ...

  9. Deep Reinforcement Learning

    Reinforcement-Learning-Introduction-Adaptive-Computation http://incompleteideas.net/book/bookdraft20 ...

  10. python用matplotlib画折线图

    折线图: import matplotlib.pyplot as plt y1=[10,13,5,40,30,60,70,12,55,25] x1=range(0,10) x2=range(0,10) ...