search
Homephp教程php手册php 递归函数的三种实现方式,php递归函数三种

php 递归函数的三种实现方式,php递归函数三种

   递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。递归函数也是解决无限级分类的一个很好地技巧。如果对无限级分类感兴趣,请参照php利用递归函数实现无限级分类。我习惯套用通俗的话解释复杂的道理,您确实不明白请参见手册。

  利用引用做参数

  先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。现在可好,两个变量共享一块存储地址。 $a=&$b; 。实际上指的是 $a 不管不顾自己原来的存储地址,非要和 $b 共享一室了。因而任何对存储地址数值的改变都会影响两个值。  

  函数之间本来也是各行其是,即便是同名函数。递归函数是考虑将引用作为参数,成为一个桥梁,形成两个函数间的数据共享。虽然两个函数见貌似操作的是不同地址,但是实际上操作的是一块儿内存地址。

  

<span>function</span> test(<span>$a</span>=0,&<span>$result</span>=<span>array</span><span>()){
</span><span>$a</span>++<span>;
</span><span>if</span> (<span>$a</span><10<span>) {
    </span><span>$result</span>[]=<span>$a</span><span>;
    test(</span><span>$a</span>,<span>$result</span><span>);
}<br />echo $a;
</span><span>return</span> <span>$result</span><span>;

}</span>

  上面的例子非常简答,以$aArray ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 ) 。

本例比较有意思的是echo $a 的值。相信很多人认为是12345678910吧,其实不然,是1098765432。为什么呢?因为函数还没执行echo $a前就进行了下一次的函数递归。真正执行echo $a是当$a

  利用全局变量

  利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。

  

<span>function</span> test(<span>$a</span>=0,<span>$result</span>=<span>array</span><span>()){
    </span><span>global</span> <span>$result</span><span>;
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a,$result</span><span>);
    }
    </span><span>return</span> <span>$result</span><span>;
}</span>

  利用静态变量

  我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值

  举个栗子:

<span>function</span><span> test(){
</span><span>static</span> <span>$count</span>=0<span>;
</span><span>echo</span> <span>$count</span><span>;

</span><span>$count</span>++<span>;
}
test();
test();
test();
test();
test();</span>

  请问这一段代码的执行结果是多少?是00000么?必然不是。是01234。首先第一次调用test(),static对 $count 进行初始化,其后每一次执行完都会保留 $count 的值,不再进行初始化,相当于直接忽略了 static $count=0; 这一句。

  因而将static应用到递归函数作用可想而知。在将需要作为递归函数间作为“桥梁"的变量利用static进行初始化,每一次递归都会保留"桥梁变量"的值。

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>static</span> <span>$result</span>=<span>array</span><span>();
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a</span><span>);
    }
    </span><span>return</span> <span>$result</span><span>;
}</span>

  

  总结

  所谓递归函数,重点是如何处理函数调用自身是如何保证所需要的结果得以在函数间合理"传递",当然也有不需要函数之间传值得递归函数,例如:

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>echo</span> <span>$a</span><span>;

        test(</span><span>$a</span><span>);
    }
}</span>

  面对这样的函数,我们就不必大伤脑筋了。顺便说一句,深入理解变量引用相关知识对解决这类问题大有裨益。

 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
C++ 递归函数的优化技巧有哪些?C++ 递归函数的优化技巧有哪些?Apr 17, 2024 pm 12:24 PM

为了优化递归函数的性能,可以采用以下技巧:使用尾递归:将递归调用放在函数末尾,避免递归开销。备忘录化:存储已计算的结果,避免重复计算。分治法:分解问题,递归解决子问题,提高效率。

如何解决Python的代码中的函数嵌套过多错误?如何解决Python的代码中的函数嵌套过多错误?Jun 25, 2023 pm 12:35 PM

Python是一门非常强大的编程语言,很多程序员都选择Python作为主要的编程语言。但是,代码中过多的函数嵌套会导致程序难以维护和理解。本文将探讨如何解决Python的代码中的函数嵌套过多错误。函数嵌套浅谈函数嵌套是指在一个函数的主体中定义另外一个函数的过程。函数嵌套可以使程序的结构更加清晰,代码也更易于阅读和维护。但是,函数嵌套过多会导致代码结构过于复杂

C++ 递归函数在搜索算法中的应用?C++ 递归函数在搜索算法中的应用?Apr 17, 2024 pm 04:30 PM

递归函数在搜索算法中用于探索树状数据结构。深度优先搜索使用堆栈探索节点,而广度优先搜索使用队列按层遍历。在实际应用中,如查找文件中,递归函数可用于在指定目录中搜索给定文件。

C++ 递归函数的退出条件是什么?C++ 递归函数的退出条件是什么?Apr 17, 2024 am 11:33 AM

C++递归函数的退出条件包括:基线条件:检查函数是否达到可直接返回结果的状态,通常判断某个条件或参数值是否满足阈值。递归终止条件:替代或补充基线条件,确保函数在一定数量的递归调用后停止,通过跟踪递归深度或设置最大递归深度限制实现。

C++ 递归函数在排序算法中的应用?C++ 递归函数在排序算法中的应用?Apr 17, 2024 am 11:06 AM

C++中递归函数在排序算法中的应用通过递归函数实现的插入排序和归并排序算法,可以将复杂的问题分解为更小的子问题,并通过递归调用高效地解决。插入排序:通过逐个插入元素,将数组有序化。归并排序:分而治之,将数组拆分并递归排序子数组,最后将排序后的子数组合并。

C++ 递归函数的尾递归优化策略如何实现?C++ 递归函数的尾递归优化策略如何实现?Apr 17, 2024 pm 02:42 PM

尾递归优化策略通过将尾递归调用转换为循环,有效减少函数调用栈深度,防止栈溢出。优化策略包括:检测尾递归:检查函数中是否存在尾递归调用。将函数转换为循环:使用循环来代替尾递归调用,并维护栈保存中间状态。

如何使用Go语言递归函数实现阶乘?如何使用Go语言递归函数实现阶乘?Jul 31, 2023 pm 08:31 PM

如何使用Go语言递归函数实现阶乘?阶乘是数学中常见的一种计算方式,它将一个非负整数n乘以比它小的所有正整数,直到1。例如,5的阶乘可以表示为5!,计算方式为54321=120。在计算机编程中,我们经常使用递归函数来实现阶乘的计算。首先,我们需要了解递归函数的概念。递归函数是指在函数的定义中调用函数本身的过程。在解决问题时,递归函数会不断地

Python编程:递归与匿名函数及函数属性与文档字符串(函数补充)Python编程:递归与匿名函数及函数属性与文档字符串(函数补充)Apr 12, 2023 pm 11:22 PM

本文简单扼要地说,辅以代码进一步地加深理解。 递归函数当函数调用自身而生成最终结果时,这样的函数称为递归。有时递归函数非常有用,因为它们使编写代码变得更容易——使用递归范式编写一些算法非常容易,而其他算法则不是这样。没有不能以迭代方式重写的递归函数,换句话说,所有递归函数都可以通过循环迭代的方式实现,因此通常由程序员根据手头的情况选择最佳方法。递归函数主体通常有两个部分:一部分的返回值依赖于对自身的后续调用,另一部分的返回值不依赖于对自身的后续调用(称基本情况,或递归边界)。作为理解的参考示例,

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!