You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl递归函数执行顺序疑问:为何key_1最后输出且被打印?

为什么key_1会最后被打印?

咱们一步步拆解这个递归函数的执行流程,就能明白其中的逻辑啦:

初始调用

main函数里初始化了哈希%tmp,然后调用test_recurse(\%tmp, 'key_1')——这是递归的起点,当前处理的cell是key_1。

递归执行的详细步骤

  1. 第一次调用:test_recurse(\%tmp, 'key_1')

    • 首先进入foreach循环,遍历@{$hash->{'key_1'}}里的元素:"A"和"B"。
    • 先处理第一个元素"A":递归调用test_recurse(\%tmp, 'A')。
  2. 第二次调用:test_recurse(\%tmp, 'A')

    • 遍历@{$hash->{'A'}}里的元素:"C",递归调用test_recurse(\%tmp, 'C')。
  3. 第三次调用:test_recurse(\%tmp, 'C')

    • @{$hash->{'C'}}是空数组(代码里没给这个键赋值),所以foreach循环直接跳过,不执行任何递归。
    • 然后执行循环后面的print "X($cell)\n",打印出X(C)。
    • 这个调用执行完毕,回到上一层(处理"A"的调用)。
  4. 回到第二次调用("A")

    • foreach循环已经处理完所有子元素(只有"C"),接下来执行print "X(A)\n",打印出X(A)。
    • 这个调用执行完毕,回到最开始的调用(处理key_1的调用)。
  5. 回到第一次调用(key_1)

    • 继续处理foreach循环的第二个元素"B":递归调用test_recurse(\%tmp, 'B')。
  6. 第四次调用:test_recurse(\%tmp, 'B')

    • @{$hash->{'B'}}是空数组,foreach循环跳过,直接执行print "X(B)\n",打印出X(B)。
    • 调用完毕,回到最开始的调用。
  7. 最终回到第一次调用(key_1)

    • foreach循环的所有子元素("A"和"B")都处理完毕了,现在执行循环后面的print "X(key_1)\n",所以最后打印出X(key_1)。

核心逻辑:后序遍历

你的误解在于以为递归函数只会处理子元素,但实际上这个函数的逻辑是:先递归处理当前节点的所有子节点,等所有子节点都处理完成后,再打印当前节点。这是典型的树结构后序遍历——根节点(key_1)会最后被处理,因为它要等所有子节点(A、B,以及A的子节点C)都打印完,才会轮到自己。

内容的提问来源于stack exchange,提问作者user1550596

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:02:37