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

求助:理解递归函数permute1中排列生成的内部运行原理

理解permute1排列生成函数的运行机制

这个函数是用递归实现的全排列生成,核心逻辑是「逐个固定首元素,递归生成剩余元素的全排列,再拼接组合」,下面拆解每一步的运行过程:

1. 递归终止条件(基础情况)

当输入的序列seq为空时:

if not seq:
    return [seq]

返回[[]](如果输入是字符串则返回[""]),这是递归的终点——空序列的排列只有它自己,后续的递归调用都会回到这个基础情况开始回溯拼接。

2. 递归核心逻辑

当输入序列非空时,函数会做这几件事:

  • 初始化空列表res,用来存储最终的所有排列
  • 遍历序列的每个索引i(每个元素都有机会成为排列的第一个元素):
    1. 生成剩余序列:rest = seq[:i] + seq[i+1:],把当前索引i的元素从原序列中移除,得到剩下的元素组成的新序列
    2. 递归生成剩余序列的全排列:调用permute1(rest),得到剩余元素的所有排列结果
    3. 拼接组合:把当前选中的第i个元素(用seq[i:i+1]切片获取,保证和原序列类型一致),和剩余序列的每个排列结果拼接,然后添加到res中
  • 遍历完成后,返回存储了所有排列的res

3. 用具体例子拆解运行过程

以输入[1,2]为例,一步步看递归流程:

  1. 第一次调用permute1([1,2]),进入else分支,循环i=0和i=1:
    • i=0时:
      • rest = [] + [2] = [2],调用permute1([2])
        • 进入permute1([2])的else分支,循环i=0:
          • rest = [] + [] = [],调用permute1([]),返回[[]]
          • 遍历x in [[]],执行res.append([2] + []),permute1([2])最终返回[[2]]
      • 回到i=0的循环,遍历x in [[2]],执行res.append([1] + [2]),res现在是[[1,2]]
    • i=1时:
      • rest = [1] + [] = [1],调用permute1([1]),返回[[1]]
      • 遍历x in [[1]],执行res.append([2] + [1]),res变成[[1,2], [2,1]]
  2. 最终permute1([1,2])返回[[1,2], [2,1]],符合预期。

如果输入是字符串"ab",逻辑完全一致,最终会返回["ab", "ba"]——这也是为什么用seq[i:i+1]而不是直接取seq[i]:切片操作能保持序列的类型(列表/字符串),避免拼接时出现类型错误。

内容的提问来源于stack exchange,提问作者Målingen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:09:31