匿名函数和闭包规避xdebug限制的函数递归深度限制

PHP版本5.6

先来个简单的用递归求和,代码如下:

function add($n){
    if($n === 1)return 1;
    return add($n - 1);
}
echo add(256); 
运行时报错: Maximum function nesting level of ‘256‘ reached, aborting!

这个报错的意思就是函数的递归深度最大是256,不能大于或等于256.在网上查找资料发现,这个是xdebug做的限制,可以通过更改配置文件来修改这个深度,xdebug.max_nesting_level = ***;但是随着$n值的变大,同样会出现这个问题。

尝试用尾递归来试试,代码如下:

function add($n,$acc = 1)
{
    if($n === 1)return $acc;
    return add($n - 1,$acc + $n);
}

用这样的方式并不能解决问题,最后在网上找资料,发现了用匿名函数和闭包可以规避这种栈溢出的问题。代码如下:

function add($n,$acc = 1)
{
    if($n === 1)return $acc;
    return function() use ($n,$acc){
        return add($n - 1,$acc + $n);
    };

}

function tem($callback,$params)
{
    // $result = call_user_func_array($callback, $params);

    // while(is_callable($result)){
    //     $result = $result();
    // }
    // return $result;
    
    $a = add($callback,$params);
    while (!is_int($a)) {
        $a = $a();
    }
    return $a;
}
var_dump(tem(10,1));
// echo tem(‘add‘,array(10));

刚开始看别人的博客,说这个是因为高级函数call_user_func_array()在中间起的作用,后来把代码修改了一下,发现其实和这个高级函数并没有多大关系,只是和匿名函数和闭包有关,但具体内部做了什么优化,暂时不得而知。

尾记:正如鸟哥所说的,其实我们碰到的大部分递归,都是尾递归,能用一个循环来解决。这样可以节省很多时间和资源。所以,能不用递归尽量不要用递归吧。

时间: 2024-11-04 10:55:31

匿名函数和闭包规避xdebug限制的函数递归深度限制的相关文章

14.匿名函数和闭包

匿名函数和闭包 学习要点:1.匿名函数2.闭包 匿名函数就是没有名字的函数,闭包是可以访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础. 一.匿名函数 //普通函数function box(){ //函数名是box return 'Lee'; } //匿名函数function(){ //匿名函数,会报错,单独的匿名函数是无法运行的 return 'Lee';} //通过表达式自我执行(function box(){ //封装成表达式 alert('Lee');})(

匿名函数和闭包

匿名函数和闭包匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.一. 匿名函数//普通函数functionbox() { //函数名是 boxreturn'Lee';}//匿名函数function() { //匿名函数,会报错return'Lee';}//通过表达式自我执行(function box() { //封装成表达式alert('Lee');})(); //()表示执行函数,并且传参//把匿名函数赋值给变量var box = function() { //将匿名函数赋给

转:php中的匿名函数和闭包(closure)

一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函数的参数值.(http://php.net/manual/zh/functions.anonymous.php) 匿名函数的定义: $closureFunc = function(){ .... }; eg: 把匿名函数赋值给变量,通过变量来调用 $closureFunc = function($s

javascript匿名函数与闭包

匿名函数是相对于有名字的函数 如function setAge(){}函数名为setAge 而类似于function(){}则就是一个匿名函数 有名字的函数执行时可以写成setAge(),而没有名字的函数则执行要写成(function())(); 另一种方式是把匿名函数赋值给一个变量来使用 var a=function(){ alert("hello,world"); } a(); 匿名函数传参 (function(age){ return age; })(100); 匿名函数产生闭包

匿名函数和闭包--【JavaScript】

匿名函数: 概念: 没有名字的函数 定义: ()()前面是定义的函数,后面要调用匿名函数并传参. 用途: 创建闭包,构建命名空间,减少全局变量的使用. 闭包: 定义: 可访问一个函数作用域里变量的函数 优点: 把局部变量驻留在内存中,避免使用全局变量. 可以减少代码量,使代码看起来更加清晰.

JavaScript中的匿名函数及函数的闭包以及作用域

1. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

详谈JavaScript 匿名函数及闭包

1.匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这也是最常规的一种 function double(x){    return 2 * x;   } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. var double = new Function('x', 'return 2 * x;');

PHP匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C++0x也开始支持了. 匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数. 闭包(Closure) 说 到匿名函数,就不得不提到闭包了,闭包是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数,

深入理解javascript 匿名函数和闭包

代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿 名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~).当一个匿名函数被括起来,然后再在后面加