PHP中递归的实现(附例子)

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

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

<?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)){

$hadle =
@opendir($dir);

while($file=readdir($hadle) )

{

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)){

$hadle = opendir($dir);

while($file=readdir($hadle))

{

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);

时间: 2024-10-24 08:50:50

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

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

目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子 一.在学习Messagequeue 类之前,首先介绍一下MSMQ的一些理论上的知识          MSMQ(MicroSoft Message Queue,微软消息队列)官方的解释是:在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的

二叉树的递归遍历和非递归遍历(附详细例子)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

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

这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可以实现.于是查了一下MSDN,发现这个机制简单的可怕,原来就和导出函数一样,把dllexport关键字加到类名前就可以了.估计和我一样的同学大有人在,把MSDN的相关文档翻译出来,附上我的注解,希望对大家有用. 评注程序均在Visual S

美!视差滚动在图片滑块中的应用【附源码下载】

视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.下面分享的这个图片滑块效果是难得一见的结合视差滚动的例子,之前的文章给大家分享过,这里再推荐一下.美女很养眼吧 :) 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 您可能感兴趣的相关文章 太赞了!超炫的页面切换动画效果[附源码下载] 创意无限!一组网页边栏过渡动画[附源码下载] 好东西!动感的页面加载

C++应用中递归的利与弊

“递归”在C++(C++培训 )++中主要解决具有树型特征的算法或数据结构,递归的利用可以使算法或数据结构大大简化,代码简洁明了,相同一个具有该特性的课题采用递归或其他算法,所要求的预定义及相应的结果都将不一样,用了递归可能使用减少部份定义,代码实现部份大大减少,一看便知.下面是一个从数据库中取数的例子对比: 实现中所使用的数据结构(表结构) 序号 英文名 中文名 类型 说明 1 Id 权限ID Int 2 ParentId 父权限ID Int 用于指定父结点 3 Name 权限名称 Varch

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

ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在SQL Server的数据库中.用户可以 根据需要决定是否在每次执行时让SQL Server进行重新编译.用户可以指定存储过程的名字和给出参数来执行它. 允许多个用户(有权)访问相同的代码. 提供一种集中且一致的实现数据完整性逻辑的方法. 存储过程用于实现:频繁使用的查询:业务规则:被其他过程使用的公

在水晶报表( Crystal Reports)中插入条形码(附视频)

水晶报表( Crystal Reports)是当今商业市场上最流行的报表环境之一.跨国公司利用水晶报表( Crystal Reports)来生成多种数据源的报表,为业务分析.战略规划和库存控制等方面提供了强大的洞察力.同时水晶报表( Crystal Reports)中也时常引入条形码技术.虽然很多条形码公司提供了条码字体或.NET控件来满足这方面的需求,然而客户发现这些解决方案十分繁琐.复杂而且价格高昂. 2010年,IDAutomation获取了一项特殊条码生成器对象的专利---Native

C语言去除数组中重复的字符简单例子

#include <stdio.h> int main(void){ int a[10]={1,2,3,3,4,5,1,3,5,6}; int i,j; int zieo=0; for(i=0;i<10;i++) for(j=i+1;j<10;j++) { if(a[i]==a[j]) { a[j]=0; } } for(i=0;i<10;i++) { if(a[i]!=zieo) { printf("%d\t",a[i]); } } printf(&qu

Android中Service的一个Demo例子

Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Service做过多讲解.  代码是从网上找的一个例子,Copy下来发现代码不完全正确,稍微修改了下.  AndroidManifest.xml <application android:icon="@drawable/ic_launcher" android:label="@stri

java中生成流水号的一个例子(使用关系型数据库)

在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水号的时候根据公司和日期联合起来生成的这个业务编码去数据库里边去查,若有记录的话就把记录的话就把对应的序列值返回,然后序列的值加一,若根据对应的业务编码查询不到相应的记录就把流水号对应的最小的值返回,然后在数据库中插入相应的记录 这种场景使用类似BerkeleyDB这种K,Value对数据库来实现是最