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

如何用Python递归返回二维列表?以爬楼梯路径问题为例

解决递归返回二维列表的问题

我完全理解你的困扰——递归处理单一值或单条路径时得心应手,但要收集多组结果成二维列表时,总觉得无从下手,尤其是还不想传递可变对象(比如列表)当参数的情况下。其实核心思路是让递归函数返回当前状态下的所有路径集合,然后上层递归把当前的选择(跳1/2/3步)拼接进去,一步步往上组合。

爬楼梯返回所有路径的实现

我们可以修改递归逻辑,让step_helper不再返回计数,而是返回当前剩余台阶数对应的所有路径列表。比如当剩余台阶数为0时,返回包含空列表的二维列表(表示到达楼顶的一条"空路径",用来作为后续拼接的基础);如果剩余台阶数小于0,返回空列表(表示没有有效路径);否则,分别递归处理剩余steps-1、steps-2、steps-3的情况,然后把当前的步数(1/2/3)加到每个子路径的开头,最后合并这三组结果。

代码实现如下:

def step_helper(steps):
    if steps == 0:
        # 剩余0步时,返回包含空列表的二维列表,代表一条完成的路径
        return [[]]
    elif steps < 0:
        # 步数为负,没有有效路径
        return []
    else:
        # 递归获取三种选择对应的所有路径,然后把当前步数加到每个路径前
        paths_1 = [[1] + path for path in step_helper(steps - 1)]
        paths_2 = [[2] + path for path in step_helper(steps - 2)]
        paths_3 = [[3] + path for path in step_helper(steps - 3)]
        # 合并所有路径
        return paths_1 + paths_2 + paths_3

def find_all_paths(steps):
    all_paths = step_helper(steps)
    return all_paths

# 测试调用
print(find_all_paths(4))

运行这个代码,输入4的话,会返回:

[[1,1,1,1], [1,1,2], [1,2,1], [1,3], [2,1,1], [2,2], [3,1]]

完全符合你要的所有路径的二维列表需求,而且全程没有传递可变对象作为参数,所有的列表都是在递归返回后新生成的,避免了可变对象带来的副作用。

为什么这个思路可行?

你之前处理单路径的递归(比如BST两点间路径),是让递归函数返回从当前节点到目标节点的单条路径,然后上层把当前节点值加进去。而处理多路径时,逻辑是类似的,只是递归函数返回的是所有可能的子路径,上层需要把当前选择加到每一条子路径上,再合并成新的路径集合。

举个简单的例子,当steps=2时:

  • step_helper(2)会调用step_helper(1)、step_helper(0)、step_helper(-1)
  • step_helper(1)返回[[1]](来自step_helper(0)的[[]]加上1)
  • step_helper(0)返回[[]],所以paths_2是[[2] + []] = [[2]]
  • step_helper(-1)返回空列表
  • 最后合并得到[[1,1], [2]],正好是两步的所有路径

扩展到其他类似问题

这个思路可以推广到所有需要收集多组递归结果的场景,比如子集问题、排列问题等等。核心就是:

  • 明确递归函数的返回值:当前状态下的所有有效结果集合
  • 递归终止条件:返回对应状态的基础集合(比如空路径、空子集)
  • 递归过程:处理当前选择,把选择和子递归的每个结果组合,再合并所有选择的结果

这样既避免了传递可变对象的副作用,又能自然地收集到所有结果组成的二维列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:09:01