background image

PHP】关于尾递归的使用

本文主要绍了关于尾递归的使用详解。供大家参考下
这几天看到几篇关于尾递归的文章,之前对尾递归没有多大概念,所以回头研究了一下
尾递归。
尾递归的概念
尾递归(Tail Recursion)的概念是递归概念的一个子集。对于普通的递归,由于必须要记
住递归的调用堆栈,由此产生的耗用是难以估量的。比如下文中 php 小节第一个例子使用
php 写一个阶乘函数,就是由于递归造成了栈溢出的错误。尾递归出现的目的就是消除递
归栈耗损这个缺憾的。

从代码层面看,尾递归其实一句话就可以说清楚了:
函数的最后一个操作是递归调用
比如"菲波纳锲"数列的 php 的递归实现:

 

复制代码 代码如下:

fibonacci.php 
<?php 
function fibonacci($n) { 
if ($n < 2) { 
return $n; 

return fibonacci($n - 1) + fibonacci($n - 2); 

var_dump(fibonacci(30)); 

这是递归函数,但不是尾递归,因为 fibonacci 的最后一个操作是加法操作。
转化为尾递归:
代码如下:

function fibonacci2($n, $acc1, $acc2) { 
if ($n == 0) { 
return $acc1; 

return fibonacci2($n-1, $acc2, $acc1 + $acc2);