【发布时间】:2013-09-19 01:06:46
【问题描述】:
我正在尝试编写一段代码,该代码将生成一个排列,或一些以递归方式都不同的字符系列。
def getSteps(length, res=[]):
if length == 1:
if res == []:
res.append("l")
res.append("r")
return res
else:
for i in range(0,len(res)):
res.append(res[i] + "l")
res.append(res[i] + "r")
print(res)
return res
else:
if res == []:
res.append("l")
res.append("r")
return getSteps(length-1,res)
else:
for i in range(0,len(res)):
res.append(res[i] + "l")
res.append(res[i] + "r")
print(res)
return getSteps(length-1,res)
def sanitize(length, res):
return [i for i in res if len(str(i)) == length]
print(sanitize(2,getSteps(2)))
所以这会返回
“LL”、“LR”、“RR”、“RL”或系列的一些排列。
我马上就可以看出这个函数可能运行得很慢,因为我必须循环遍历整个数组。我试图让这个过程尽可能高效,但这是我能做到的。我知道在跑步过程中会发生一些不必要的事情,但我不知道如何让它变得更好。所以我的问题是:如何提高效率并减少这段代码的运行时间?
edit = 我希望能够将此代码移植到 java 或其他一些语言,以便理解递归的概念,而不是使用外部库并在不理解的情况下解决我的问题。
【问题讨论】:
-
标准库是否为您提供了可以充分利用的任何工具,或构建解决方案? docs.python.org/2/library/itertools.html
-
可以稍微提高性能的一件事是将“if res == []”更改为“if not res”,因为空列表在 Python 中的计算结果为 False。
-
谢谢你,但我希望解决方案是递归的,因为我试图在这段代码中编写一种用于递归的“概念证明”。此外,我希望能够将其移植到 java 或 c++ 以真正理解这个概念而不是语法。
-
一般情况下
getSteps应该做什么?您想要一种排列还是全部排列?
标签: python performance time