如何减少这个特定解决方案的运行时间?

时间:2013-09-19 01:06:46

标签: python performance time

我正在尝试编写一段代码,这些代码将生成一个排列,或者一系列以递归方式不同的字符。

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或其他语言,以便理解递归的概念,而不是使用外部库,并在不理解它的情况下解决我的问题。

3 个答案:

答案 0 :(得分:2)

你的设计被打破了。如果您再次拨打getStepsres将不会是一个空列表,它将从上次呼叫中留下垃圾。

我认为您希望以递归方式生成排列,但我不明白您使用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的函数,它完全符合您想要实现的目标。