PHP递归函数两次自调用执行顺序及两层递归可视化问询
问题1:PHP中递归函数内部调用自身两次时的调用顺序是怎样的?
PHP的函数调用遵循深度优先的执行逻辑:当函数内先触发第一个递归调用时,程序会优先走完这个调用的完整递归分支,直到触达终止条件(比如你的代码中$depth减至0),才会回头执行第二个递归调用。
以你提供的代码为例,假设初始调用是generate_polygons(初始多边形, 2),执行顺序如下:
- 先执行第一个递归:
generate_polygons(多边形B, 1, 'B') - 在这个调用里,继续先执行它的第一个递归:
generate_polygons(多边形B的B子多边形, 0, 'B')——触达终止条件,该分支执行完毕 - 回到
generate_polygons(多边形B, 1, 'B'),执行它的第二个递归:generate_polygons(多边形B的A子多边形, 0, 'A')——执行完毕,该层级调用结束 - 回到初始调用,执行第二个递归:
generate_polygons(多边形A, 1, 'A') - 重复类似流程:先走完
多边形A的B子分支,再处理它的A子分支
简单来说,就是先钻透第一个递归分支的所有深度,再处理第二个分支。
问题2:如何可视化两层递归,确定各多边形的拆分阶段?
针对你的代码,可视化两层递归(即$depth=2)可以用以下几种实用方法:
1. 打印日志追踪执行流程
在递归函数中添加日志输出,记录当前处理的多边形标识、剩余深度和类型,直接通过文本输出直观看到拆分顺序:
function generate_polygons($polygon, $depth, $polygon_type=NULL) { // 给每个多边形生成唯一标识,方便追踪 $polygon_id = $polygon_type ? "{$polygon->parent_id}-{$polygon_type}" : "P0"; echo "[深度{$depth}] 当前处理: {$polygon_id}\n"; // 假设拆分逻辑中给子多边形设置parent_id $polygon_b->parent_id = $polygon_id; $polygon_a->parent_id = $polygon_id; if ($depth > 0) { $this->generate_polygons($polygon_b, $depth-1, 'B'); $this->generate_polygons($polygon_a, $depth-1, 'A'); } else { echo "[终止] 停止拆分: {$polygon_id}\n"; } }
当$depth=2时,输出会是:
[深度2] 当前处理: P0 [深度1] 当前处理: P0-B [深度0] 当前处理: P0-B-B [终止] 停止拆分: P0-B-B [深度0] 当前处理: P0-B-A [终止] 停止拆分: P0-B-A [深度1] 当前处理: P0-A [深度0] 当前处理: P0-A-B [终止] 停止拆分: P0-A-B [深度0] 当前处理: P0-A-A [终止] 停止拆分: P0-A-A
2. 绘制文本树形结构
把多边形的拆分关系整理成树形结构,直观展示层级:
P0(初始多边形) ├─ P0-B(第一次拆分的B多边形) │ ├─ P0-B-B(P0-B拆分的B子多边形) │ └─ P0-B-A(P0-B拆分的A子多边形) └─ P0-A(第一次拆分的A多边形) ├─ P0-A-B(P0-A拆分的B子多边形) └─ P0-A-A(P0-A拆分的A子多边形)
这个结构完全对应递归的执行顺序——先遍历左分支(B分支)到底,再处理右分支(A分支)。
3. 图形化绘制拆分过程
如果要直观看到多边形的形态变化,可以在每次拆分时记录多边形的坐标信息,按递归顺序绘制:
- 先绘制初始多边形P0
- 接着绘制P0拆分后的P0-B,再绘制P0-B的两个子多边形
- 完成B分支后,再绘制P0-A及其子多边形
- 用不同颜色区分B/A类型的多边形,或者用数字标注拆分顺序,清晰展示每个阶段的拆分结果
内容的提问来源于stack exchange,提问作者Noel Whitemore
相关产品推荐
相关产品推荐

