首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个PHP递归函数不起作用

PHP中的递归函数是一种强大的工具,它允许函数调用自身来解决问题。如果一个递归函数不起作用,可能是由于以下几个原因:

基础概念

递归函数通常包含两个主要部分:

  1. 基准情况(Base Case):这是递归结束的条件,防止无限递归。
  2. 递归步骤(Recursive Step):函数调用自身来逐步逼近基准情况。

可能的原因及解决方法

1. 缺少基准情况

如果递归函数没有明确的基准情况,它将无限递归下去,最终导致栈溢出错误。

示例代码:

代码语言:txt
复制
function factorial($n) {
    return $n * factorial($n - 1); // 缺少基准情况
}

解决方法: 添加基准情况来终止递归。

代码语言:txt
复制
function factorial($n) {
    if ($n == 0) return 1; // 基准情况
    return $n * factorial($n - 1);
}

2. 递归步骤不正确

如果递归步骤没有正确地使问题规模减小,或者没有朝着基准情况前进,递归同样会失败。

示例代码:

代码语言:txt
复制
function sumArray($arr) {
    return $arr[0] + sumArray($arr); // 错误的递归步骤
}

解决方法: 确保每次递归调用都在缩小问题的规模。

代码语言:txt
复制
function sumArray($arr) {
    if (count($arr) == 1) return $arr[0]; // 基准情况
    return $arr[0] + sumArray(array_slice($arr, 1)); // 正确的递归步骤
}

3. 参数传递错误

递归函数中的参数可能没有正确传递,导致函数无法按预期工作。

示例代码:

代码语言:txt
复制
function fibonacci($n) {
    if ($n <= 1) return $n;
    return fibonacci($n); // 参数错误
}

解决方法: 确保参数正确传递,逐步逼近基准情况。

代码语言:txt
复制
function fibonacci($n) {
    if ($n <= 1) return $n;
    return fibonacci($n - 1) + fibonacci($n - 2); // 正确的参数传递
}

4. 性能问题

递归函数可能因为重复计算相同的子问题而导致性能低下。

示例代码:

代码语言:txt
复制
function fibonacci($n) {
    if ($n <= 1) return $n;
    return fibonacci($n - 1) + fibonacci($n - 2); // 存在大量重复计算
}

解决方法: 使用记忆化技术来存储已经计算过的结果。

代码语言:txt
复制
function fibonacci($n, &$memo = []) {
    if ($n <= 1) return $n;
    if (!isset($memo[$n])) {
        $memo[$n] = fibonacci($n - 1, $memo) + fibonacci($n - 2, $memo);
    }
    return $memo[$n];
}

应用场景

递归函数广泛应用于各种算法中,如树的遍历、排序算法(如快速排序)、分治算法等。

总结

要确保递归函数正常工作,必须明确基准情况,正确设计递归步骤,并注意参数的正确传递。在必要时,可以采用记忆化等技术优化性能。如果遇到问题,应逐步检查这些方面,找出并修复错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP递归算法_php递归函数详解

并且需要注意,在函数体内定义的global变量,函数体内可以使用,在函数体外定义的global变量不能在函数体内使用。...注:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。递归即调用自身的函数。...在使用递归时,我们需要在函数中定义退出条件,否则它将进入无限循环(这里我们通过if语句定义了退出条件)。 引用传参的方式实现递归算法: 1 "; 9 return $result; 10 } 11 var_dump(test()); php的引用,简单来说就是在变量或者函数、对象等前面加上&符号(也就是引用符号),这里就需要了解下...PHP引用传递的概念,即可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。

3K20

php递归函数详解_用php递归函数实现阶乘计算

本节内容: PHP递归算法。...> 递归调用常常与静态变量使用。 静态变量的含义可以参考PHP手册。 例子,加深对PHP递归算法以及静态变量的理解。...在static_function函数第二次运行时,变量i由于是静态变量,所以仍被保留不被释放,进而可以得到自增的值。 以上介绍了php递归算法的实现代码与用法,希望对大家有所帮助。...php递归函数小例子 php递归算法 php递归函数无限级分类 PHP递归算法与应用实例 php递归算法应用实例 php递归实现无限分类 php格式化数组 php递归方法实现无限分类示例 php递归遍历目录的二个函数...php用递归方法实现无限级分类的代码 php递归创建和删除文件夹的代码 php递归删除目录的例子 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169563.html

2.8K20
  • 关于php递归函数内存溢出的问题

    简单写一个递归函数: echo '运行前内存:' . round(memory_get_usage() / 1024 / 1024, 2) . ...'MB', PHP_EOL; recursive(); function recursive($i=1000){     if ($i<=0){         return false;     }...'MB', PHP_EOL;     recursive($i-1); } 可看到,内存占用将一直上升,直到运行完毕或者内存溢出强制退出,那么为什么会出现这样的情况呢?...主要是因为php的内存回收机制: php的垃圾回收机制 php只有在该函数执行完毕后才会进行回收,而该函数需要调用新的函数(递归),导致$data一直没有回收,直到执行完毕之后才会进行回收,所以造成了内存溢出...解决方案 解决方案也很简单,在使用完data之后,递归调用之前,进行unset销毁data即可: 本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

    2.7K20

    什么是php递归函数及简单实例讲解

    递归函数即自调用函数,在函数体内部直接或者间接的自己调用自己,即函数的嵌套调用是函数本身。...通常在此类型的函数提之中会附加一个条件判断叙述,以判断是否需要执行递归调用,并且在特定的条件下终止函数的递归调用动作,把目前流程的主控权交回到上一层函数来执行。...以此,当某个执行递归调用的函数没有附加条件判断叙述时,可能会造成无限循环的错误情形。 函数递归调用最大的好处在于可以精简程序中的复杂重复调用程序,并且能以这种特性来执行一些较为复杂的运算动作。...随着计算机硬件性能的不断提高,程序在更多的场合优先考虑可读而不是高效,所以,鼓励用递归函数实现程序思想。 一个简单的递归调用实例如下所示: php //声明一个函数,用于测试递归 function test($n){ echo $n."

    56920

    php递归函数返回值返回不出的问题

    今天上班用到了递归函数求分类最上级,代码如下 //分类递归查找上级分类 function get_cat_pid($cat_id,$data){     $sql = "select cat_id,cat_name...,到return的时候只能打印一个null,一直改都没法解决 后来想到了存session,存session的确解决了,但感觉非常不好 直到我度娘到了&$这个东西, 百度一下释义,说是引用变量 $b=&...        return;     }else{         return;     } } get_cat_pid($cat_parent_id,$a);   var_dump($a); 解决了递归函数传值不出的问题...,但我至今还不知道为什么return不出值........经过了大神的教诲,现在终于明白为什么会返回null了 函数的return是返回给调用这个函数的值,当循环两次值为0时,会返回给循环第一次的本身函数,然后再返回给调用函数的... 大神原话 ?

    4.5K20

    PHP自定义递归函数实现数组转JSON功能【支持GBK编码】

    本文实例讲述了PHP自定义递归函数实现数组转JSON功能。...分享给大家供大家参考,具体如下: 问题: 由于最近的一个项目中要给别的公司提供接口,给他们喂 GBK 编码的 json 数据,但是有一个问题是 PHP 中的 json_encode 加密函数只支持 utf...我们的数据是 GBK 编码的,接收方要求的数据格式也是 GBK 编码的,一开始想的是先将数据转为 utf-8 编码再使用 json_encode 函数,结果是这导致我们的中文内容乱码了,所以,最后使用的是手动对数据加密的方式...实现: 想实现这个功能,最主要是观/ /察 json 数据的特点,一开始 LZ 得不到位导致不能完全实现 json_encode 函数的功能,后面参照网上的资料,实现了这个功能(就是一个递归函数): function...格式化工具: JSON在线格式化工具: 在线XML/JSON互相转换工具: json代码在线格式化/美化/压缩/编辑/转换工具: C语言风格/HTML/CSS/json代码格式化美化工具: 希望本文所述对大家PHP

    1.1K00

    PHP技巧和窍门来简化你的代码

    技巧5 :(递归优先于重复) 技巧6 : (PHP + HTML) 技巧7: (编写功能块) 技巧8: (使用类型) 技巧9 : (框架/库是没有坏处的) 提示10 : (不要只是为了写代码!)...请注意,此函数是类范围的,因此使用$this 技巧6 : (PHP + HTML) 当您想用HTML中的PHP或PHP中的HTML编写时。 我们通常会做类似的事情: 函数说明,但是在大型项目中为所有函数和变量编写函数说明成为一项艰巨的任务。...为什么? 如果将“ chair”传递到函数中,它将被评估为allItems()["c"],最终将导致错误,使您在12am起床。...谢谢阅读 这些是我在PHP之旅中发现的一些技巧和窍门,其中一些可能对您有用,而另一些则可能不起作用,请随时选择自己喜欢的并坚持使用。

    3.2K40

    PHP函数下+数组一部分

    第二:这个.php文件执行完毕后销毁 而普通的局部变量是这个所在函数执行完之后就自动销毁。 普通的变量是怎么样的? 函数是否定义: 递归: 陈业贵,递归是什么? 老师,是自己调用自己。 在哪里自己调用自己呢? 老师,在函数内部。 但是这个的核心是什么?...老师,是必须在外部调用函数,才能自己调用自己 为什么,因为你不给我钱,我怎么花啊 老师,俺代码演示把 老师:好 那陈业贵我想问你就是一般为重复调用会无休止的执行下去怎么停止呢 陈业贵:老是,加个条件...记住,兄弟们,递归解决无限极分类的,虽然这个技术我也不懂勒 兄弟们,99乘法表哈来了 <?

    39610

    PHP与Recursion

    下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP: <?...即便代码能正常运行,只要我们不断增大参数,程序迟早会报错: Fatal error:  Allowed memory size of … bytes exhausted 为什么呢?...简单点说就是递归造成了栈溢出。有几个方法可以用来规避这个问题,比如说利用尾调用(Tail Call)来消除递归对栈的影响。...让我们先来看看尾调用的定义:如果一个函数在执行了一次函数调用后,不再做别的事就称为尾调用。形象点说就是直接返回一个函数调用。尾调用不会返回原来的函数,所以不需要额外的栈保留调用函数的数据。...简单点说就是利用高阶函数消除递归,依照这样的理论基础,我们可以把上面的尾调用代码改写成如下方式: <?

    74720

    PHP的SPL扩展库(三)迭代器

    等等,都有它们对应的 RecursiveCachingIterator 、 RecursiveFilterIterator 类,这个大家就自己去研究下吧,带递归迭代器,也就是多了两个方法 getChildren...这个例子相当地直观,也非常有助于我们理解迭代器这堆方法函数到底在干嘛。...FilterIterator 过滤迭代器 过滤这个词熟悉不,array_filter() 这个函数也是针对数组进行过滤操作的。同样地,FilterIterator 迭代器也是实现类似的效果。...先讲这个迭代器正是因为它和 array_filter() 实在是太像了。array_filter() 也是一样的通过一个回调函数来进行过滤判断的。...同样地从名字中我们可以看出一些端倪,那就是这个迭代器是没有 rewind() 方法的,或者说,这个方法是不起作用的。

    67530

    PHP常见面试题_php面试常问面试题

    而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。...1.4 error_reporting 等调试函数使用 error_reporting() 函数能够在运行时设置php.ini中 error_reporting 指令。...使用此函数时 display_errors必须是打开状态。 1.5 写代码来解决多进程/线程同时读写一个文件的问题。 PHP是不支持多线程的,可以使用php的flock加锁函数实现。...echo(),print(),print_r()的区别 答:echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象...答:.用strrev函数呗,不准用PHP内置的就自己写: strrev($str) { $len=strlen($str); $newstr = ''; for($i=$len

    71320

    数据结构与算法:递归算法

    重要的是要知道我们应该提供某种情况来终止这个递归过程。 所以我们可以说,每次函数调用自身时都会使用原始问题的简单版本。...为什么需要递归 递归是一项令人惊奇的技术,借助它我们可以减少代码的长度并使其更易于阅读和编写。与稍后将讨论的迭代技术相比,它具有某些优点。...为什么递归会出现Stack Overflow错误? 如果未达到或未定义基本情况,则可能会出现堆栈溢出问题。让我们举个例子来理解这一点。...让我们通过一个简单的函数来举例说明递归是如何工作的。 PHP php // PHP程序演示 递归的工作原理 // 用于演示递归工作的函数 function printFun($test) { if ($test < 1) { return; } else

    19210
    领券