我想创建一个以递归方式返回所有可能的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)
因为这是我参加课程的第一年,我的老师不想打扰我的表现问题,但由于我对此事非常感兴趣,我想澄清一下。提前谢谢!
请原谅我缺乏完美的英语,我的母语是荷兰语。
答案 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的代码效率最高。