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

同一函数的多重递归原理解析:powerset函数执行流程问询

拆解幂集递归函数的执行流程

我来给你一步步捋清楚这个递归函数的执行逻辑,拿输入"abc"做例子,你就能明白两次递归调用的先后顺序和深层逻辑了。

首先得先get到这个函数的核心思路:它通过两次递归调用分别对应两种选择——把当前位置的字符加入结果串,或者不加入,以此遍历出字符串的所有子集(也就是幂集)。而且递归是「深度优先」的,必须把第一个递归的所有分支都走到底,才会回头处理第二个递归的分支。


初始调用:powerSet("abc", 0, "")

此时n=3,index=0不等于3,所以先执行第一个递归(选当前字符),等这个分支的所有子任务全做完,才会轮到第二个递归(不选当前字符)。

第一分支:选第0个字符('a')→ powerSet("abc", 1, "a")

进入这个调用后,index=1≠3,还是先执行第一个递归:

选第1个字符('b')→ powerSet("abc", 2, "ab")

index=2≠3,继续走第一个递归:

选第2个字符('c')→ powerSet("abc", 3, "abc")

现在index=3等于n=3,触发终止条件:打印"abc",然后返回上一层(回到index=2的调用)。

回到index=2的调用,第一个递归已经走完了,现在执行第二个递归(不选第2个字符):

不选第2个字符→ powerSet("abc", 3, "ab")

index=3等于n,打印"ab",返回上一层(回到index=1的调用)。

回到index=1的调用,第一个递归(选'b'的分支)走完了,现在执行第二个递归(不选第1个字符):

不选第1个字符→ powerSet("abc", 2, "a")

index=2≠3,先执行第一个递归:

选第2个字符→ powerSet("abc", 3, "ac")

打印"ac",返回。然后执行第二个递归:

不选第2个字符→ powerSet("abc", 3, "a")

打印"a",返回上一层(回到初始调用index=0)。


第二分支:不选第0个字符→ powerSet("abc", 1, "")

现在初始调用的第一个递归(选'a'的所有分支)已经全部走完,终于轮到第二个递归了。进入这个调用:
index=1≠3,先执行第一个递归:

选第1个字符('b')→ powerSet("abc", 2, "b")

index=2≠3,第一个递归:

选第2个字符→ powerSet("abc", 3, "bc")

打印"bc",返回。然后第二个递归:

不选第2个字符→ powerSet("abc", 3, "b")

打印"b",返回上一层(回到index=1的调用)。

回到index=1的调用,第一个递归走完,执行第二个递归:

不选第1个字符→ powerSet("abc", 2, "")

index=2≠3,第一个递归:

选第2个字符→ powerSet("abc", 3, "c")

打印"c",返回。然后第二个递归:

不选第2个字符→ powerSet("abc", 3, "")

打印空字符串"",返回。


最终输出顺序

把所有打印结果按执行顺序列出来就是:

abc
ab
ac
a
bc
b
c

简单总结一下:每次递归都会先把「选当前字符」的所有子分支彻底走到底(直到触发终止条件),然后再退回来处理「不选当前字符」的子分支。就像走迷宫,先把一条路走到尽头,再退回来走另一条岔路,这样就能遍历出所有可能的子集了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:53:16