PHP 递归函数怎么写
学编程的人可能都听说过“递归”,很多新手刚接触PHP时,会被这个概念绕晕,其实它没那么复杂——说白了就是“函数自己调用自己”,解决一些按固定规律重复的问题。今天就用咱们生活里的例子,把PHP递归函数的写法拆得明明白白。
先搞懂递归的核心:别让它“无限循环”
举个大家都熟的例子:剥花生。如果要剥10颗花生,你会怎么干?拿一颗剥好,再剥下一颗,直到10颗都剥完。但换个思路:剥10颗的活,等于“剥1颗 + 剥剩下9颗的活”;剥9颗的活,又等于“剥1颗 + 剥剩下8颗的活”……直到剥到最后1颗,直接剥完就结束。

这个“做一件事等于做1步 + 做同类小事”的逻辑,就是递归。但如果没说清“剥到最后1颗就停”,你会一直剥下去——这就是递归最容易踩的坑:没有终止条件,最后会报错。
写PHP递归函数的3个基本步骤
按上面的花生例子,我们一步步写出PHP递归函数,保证新手能跟着做。
第一步:先想“函数要做的事”。我们要写一个函数,输入“要剥的花生数量”,返回“剥好的花生总数”。
第二步:写终止条件。这是递归的“刹车”,比如剥花生的终止条件就是“如果要剥的花生数是0,就不用剥了,返回0”。
第三步:写“自己调用自己”的部分。比如要剥$n颗花生,先剥1颗(加1),再剥剩下的$n-1颗,把两部分结果加起来。
把这些逻辑写成代码,就是这样:
`php
function peel_peanut($n) {
// 终止条件:要剥的花生数是0,返回0
if ($n == 0) {
return 0;
}
// 自己调用自己:剥1颗 + 剥剩下的$n-1颗
return 1 + peel_peanut($n - 1);
}
// 测试:剥3颗花生,输出3
echo peel_peanut(3);
`
测试一下:输入3时,函数会先算1 + peel_peanut(2);peel_peanut(2)又算1 + peel_peanut(1);peel_peanut(1)算1 + peel_peanut(0);peel_peanut(0)触发终止条件,返回0。最后倒推:1+1+1+0=3,结果完全对。
避开递归的2个常见误区
- 终止条件没写对,会“爆栈”。还是剥花生,如果你把终止条件写成$n==1,那输入0时会一直调用自己,最后PHP会报错“内存溢出”,因为计算机存不下你无限次的调用请求。
- 不要用递归做简单循环的事。比如刚才的剥花生,用普通循环也能实现,而且更快。递归更适合“按层级拆分”的问题,比如算文件目录里的所有子文件(文件夹套文件夹,拆成小文件夹处理)、计算阶乘(5! = 5×4×3×2×1)。
用阶乘再练一次,加深理解
阶乘就是从1乘到某个数,比如5! = 5×4×3×2×1=120。用PHP递归写,和剥花生逻辑几乎一样:
`php
function factorial($num) {
// 终止条件:1的阶乘是1
if ($num == 1) {
return 1;
}
// 自己调用自己:当前数 × 前一个数的阶乘
return $num * factorial($num - 1);
}
echo factorial(5); // 输出120
`
是不是和剥花生的逻辑一模一样?只是把“加1”换成了“乘当前数”,终止条件从0换成了1。
其实PHP递归函数的写法没什么特殊技巧,核心就是记住“先写停止的理由,再写重复的逻辑”,用生活里的小事套一下,很快就能上手。