365bet注册送钱PHP递归重回值时出现的难点消除办法

写点小算法题练练手,二种方法消除Joseph环难点。一种递归的,一种非递归的。

我们在利用PHP递归时,会遇见各式各样的标题,当中相比较令人烦恼的是关于PHP递归重回值时出现的主题素材。其实细细思虑那是四个很简短的题目。可便是以此大致的难点困扰了半个清晨。难题出在递归函数的再次来到值上。

本文实例为我们大饱眼福了thinkphp达成Infiniti分类的详尽代码,希望对大家学习最棒分类有所启发。

递归的概念

test6.php

那是从头写的:

数据库:test
数据表:(tp_category):

   

<?php
/**
 * 递归
 */
function king($arr,$n,$i)
{
    if(count($arr) == 1)
    {
        return $arr;
    }
    foreach($arr as $k=>$v)
    {
        if($i== $n)
        {
            array_shift($arr);
            $i = 1; // 重新开始
        }else
        {
            $of1 = array_shift($arr);
            array_push($arr,$of1);
            $i++;  // 指针移动
        }
        return king($arr,$n,$i);

    }
}
$i = 1;
$arr = array(1,2,3,4,5,6,7,8,9,10);
$king = king($arr,5,$i);
print_r($king);
// output Array ( [0] => 3 )

复制代码 代码如下:

365bet注册送钱 1

递归(http:/en.wikipedia.org/wiki/Recursive)是一种函数调用自己(直接或直接)的一种机制,这种强硬的思考能够把一些复杂的概念变得极为简略。在微型Computer科学之外,极度是在数学中,递归的概念一般。譬如:最常用于递归批注的斐波那契数列正是二个颇为卓绝的事例,而任何的例如阶层(n!)也得以转账为递归的定义(n!

n*(n-1)!).尽管是在现实生活中,递归的沉思也是处处可知:比方,由于作业难点你供给校长盖章,但是校长却说“唯有教育CEO盖章了我才会打字与印刷”,当您找到辅导老董,指导总经理又说:“唯有系首席营业官盖章了自家才会打字与印刷”…直到你谈起底找到班CEO,在获得班老总豪先生爽的打字与印刷之后,你要每个重返到系主管、带领COO、最后得到校长的打字与印刷,进程如下:

365bet注册送钱 2

递归函数是一种调用本人的函数。写递归函数时要小心,因为或许会无穷递归下去。必须保障有丰富的措施来终止递归。

一:使用 参数引用达成递归函数。操作的是千篇一律块内部存款和储蓄器地址。

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

总结

以上所述是笔者给大家介绍的PHP中递归的达成实例详解,希望对大家有着支持,借使大家有此外疑问请给本身留言,笔者会及时回复大家的。在此也特别谢谢大家对台本之家网址的辅助!

test8.php

<?php  
function test($i)  
{  
$i -= 4;  
if($i < 3)  
{  
return $i;  
}  
else   
{  
test($i);  
}  
}  
echo test(30);  
?>

Common/conf/config.php

您只怕感兴趣的稿子:

  • thinkPHP完结递归循环栏目并依据树形结构Infiniti极输出的艺术
  • PHP递归遍历多维数组实现Infiniti分类的方法
  • PHP递归完毕层级树状张开
  • PHP达成Infiniti级分类(不行使递归)
  • PHP达成递归Infiniti级分类
  • php达成递归的两种为主形式
  • php递归函数两种落成方式及怎么着贯彻数字增加
  • php实现Infiniti级分类(递归方法)
<?php
/**
 * 循环
 */
function king($arr ,$n)
{
    $i = 0 ;   
    while(count($arr)>1)
    {
       if(($i+1)%$n ==0) 
       {
         unset($arr[$i]) ;
       } 
       else 
       {
         unset($arr[$i]) ;
       }
       $i++ ;
    }
return $arr ;
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
print_r(king($arr,5));
// output Array ( [45] => 3 )

这段代码看起来没非常,其实有else里面是有题指标。在那边进行的test未有重回值。所以就算知足条件$i
< 3时 return
$i整个函数依旧不会再次来到值的。对地方的PHP递归再次回到值函数做如下修改:

'DB_CONFIG2' => array(
 'db_type' => 'mysql',
 'db_user' => 'root',
 'db_pwd' => '',
 'db_host' => 'localhost',
 'db_port' => '3306',
 'db_name' => 'test',
 'DB_PREFIX' => 'tp_', // 数据库表前缀
 'DB_CHARSET'=> 'utf8', // 字符集
 'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
),

复制代码 代码如下:

Common/function.php 遍历函数loop

< ?php  
function test($i)  
{  
$i -= 4;  
if($i < 3)  
{  
return $i;  
}  
else   
{  
return test($i); //增添return, 让函数再次来到值  
}  
}  
echo test(30);  
?>

/*
 * 递归遍历
 * @param $data array
 * @param $id int
 * return array
 * */
function recursion($data, $id=0) {
 $list = array();
 foreach($data as $v) {
 if($v['pid'] == $id) {
 $v['son'] = recursion($data, $v['id']);
 if(empty($v['son'])) {
 unset($v['son']);
 }
 array_push($list, $v);
 }
 }
 return $list;
}

以上代码示例正是PHP递归重回值出现难题时的现实化解办法。

Controller/IndexController.class.php

发表评论

电子邮件地址不会被公开。 必填项已用*标注