我正在尝试编写一段代码,这些代码将生成一个排列,或者一系列以递归方式不同的字符。
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或其他语言,以便理解递归的概念,而不是使用外部库,并在不理解它的情况下解决我的问题。
答案 0 :(得分:2)
你的设计被打破了。如果您再次拨打getSteps
,res
将不会是一个空列表,它将从上次呼叫中留下垃圾。
我认为您希望以递归方式生成排列,但我不明白您使用getSteps
函数的位置
这是一个简单的递归函数
def fn(x):
if x==1:
return 'LR'
return [j+i for i in fn(x-1) for j in "LR"]
答案 1 :(得分:1)
有没有办法将二元方法和递归方法结合起来?
是的,并且@gribbler 非常接近该评论所附的帖子。他只是把它们拼凑成“另一个顺序”。
如何以递增的顺序构建长度为n
的所有位串(当被视为二进制整数时)?好吧,如果您已经拥有长度为n-1
的所有位串,则可以在其前面添加0
前缀,然后使用1
将它们全部添加到前面。就这么简单。
def f(n):
if n == 0:
return [""]
return [a + b for a in "RL" for b in f(n-1)]
print(f(3))
打印
['RRR', 'RRL', 'RLR', 'RLL', 'LRR', 'LRL', 'LLR', 'LLL']
将R
替换为0
,将L
替换为1
,并且按顺序递增0到7的8个二进制整数。
答案 2 :(得分:0)
你应该研究一下itertools。有一个名为permutations
的函数,它完全符合您想要实现的目标。