Python:什么是最有效的递归输出方法?

时间:2015-11-10 10:55:57

标签: python performance recursion

我想创建一个以递归方式返回所有可能的n位二进制数列表的函数。由于我是一名计算机科学专业的学生,​​因此我获得了多种解决方案,但我的问题是哪种方法最有效(最好是为什么)。此外,如果任何人都可以提出另一种更有效的方法(它必须是递归的,而不是迭代的),请随意添加它作为答案!

这些方法(不是任何顺序)都是给我的:

  

积层

def rec_output2(n, s = ""):
    if n == 0:
        return [s]
    else:
        sol_zero = rec_output2(n-1, s + "0")
        sol_one = rec_output2(n-1, s + "1")
        return sol_zero + sol_one
  

展开

def rec_output3(n):
    if n == 0:
        return [""]
    else:
        l = rec_output3(n-1)
        new_l = []
        # we pull iteration inside
        for s in l:
            new_l += [s + "0"]
            new_l += [s + "1"]
        return new_l
  

扩展和建立

def rec_output4(n, sols = None):
    if sols == None:
        sols = [""]
    if n == 0:
        return sols
    else:
        new_sols = []
        # we pull iteration inside
        for s in sols:
            new_sols += [s + "0"]
            new_sols += [s + "1"]
        return rec_output4(n-1, new_sols)

因为这是我参加课程的第一年,我的老师不想打扰我的表现问题,但由于我对此事非常感兴趣,我想澄清一下。提前谢谢!

请原谅我缺乏完美的英语,我的母语是荷兰语。

3 个答案:

答案 0 :(得分:1)

改进性能的第一步是memoize您的代码。这将防止冗余重新计算已经计算过的(字符串)字符串。

答案 1 :(得分:1)

您必须对代码进行分析,但通常情况下,生成器可以胜过手动迭代。

def gen(bits):
  if bit == 1:
     return ["0", "1"]

  smaller = gen(bits - 1)

  return ["0" + b for b in smaller] + ["1" + b for b in smaller]

诚然,这使用了迭代和递归。

答案 2 :(得分:0)

构建效率最低,其他两个几乎相等。 当然,Vatine的代码效率最高。