python - 在递归函数中附加到列表的干净方法
问题描述
在为这样的列表查找排列时:
def permut(nums: List[int]) -> List[List[int]]:
result = []
def perm(a, k=0):
if k == len(a):
result.append(a)
else:
for i in range(k, len(a)):
a[k], a[i] = a[i], a[k]
perm(a, k + 1)
a[k], a[i] = a[i], a[k]
perm(nums)
return result
这不起作用,因为我a
每次都在覆盖,结果只是所有指向的项目列表a
我可以将该行更改为:
result.append([item for item in a])
但这似乎只是一种从 a 创建新列表的技巧。在递归函数中处理追加到列表的更好方法是什么?
解决方案
更好的递归方法是避免自己管理项目来回交换,而是依靠调用堆栈为您执行此操作:
def perm(lst):
if lst:
for index, item in enumerate(lst):
for p in perm(lst[:index] + lst[index + 1:]):
yield [item, *p]
else:
yield []
以便:
for p in perm([1, 2, 3]):
print(p)
输出:
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
推荐阅读
- angular - 我可以停止特定端点的默认角度重定向行为吗?
- python - 如何在有条件的情况下删除txt中的几行
- angular - 修改Angular html文件中变量的值
- java - 从 cmd 运行时遇到 java.lang.NoClassDefFoundError(错误名称:)问题
- python - 给定X和Y的坐标,如何在python中绘制相邻的多边形?
- c++ - 显示/隐藏控件后如何更新窗口的当前状态?
- java - 即使在添加 vm 参数后也找不到模块 javafx.controls
- rust - 无法分配,因为它是在返回包含引用的 Result 的结构的方法中借用的
- php - 在 WooCommerce 中阻止在没有运输方式的情况下访问结帐
- filenet-p8 - 为 Filenet 形成 ExecuteSearch Soap 操作