这是一项非常简单的任务,我觉得我应该能做到 - 但仅仅是因为我的生活,无法弄清楚。
我正在尝试编写一个递归函数来复制以下内容:
chars = '0123456789abcdef'
for a in chars:
for b in chars:
for c in chars:
for d in chars:
print a+b+c+d
寻找一个例子并没有证明是非常有成效的。
代码不起作用:
chars = 'ABCDEF'
def resu(chars, depth = len(chars)):
for char in chars:
if depth == 0:
return char
return char + resu(chars, depth - 1)
print resu(chars)
答案 0 :(得分:5)
如果你有itertools
:
from itertools import product
for a,b,c,d in product('abc', repeat=4):
print a+b+c+d
答案 1 :(得分:4)
我不打算把它写出来,因为那会破坏目的,但这里有一个暗示:想想你停止递归的条件。这是关键点:
for char in chars:
return char + recurse(chars, depth - 1)
编辑:这就是我忘记Python不是为这类事情而制作的。它需要展平。
它不起作用的原因是最外层循环中的返回将在第一次被调用时结束整个事物。
你真正想要做的事情更像是这样:
def resu(chars, depth = None, prefix=''):
if depth is None:
depth = len(chars)
if depth == 0:
print prefix
return
for ch in chars:
resu(chars, depth - 1, ch + prefix)
请注意,对于中等长度chars
,这将产生很多行(n!
)。正如已经指出的那样,这不是在Python中获得此结果的最佳方法,但了解递归非常有用。
答案 2 :(得分:2)
有了@David Heffernan的回答,如果你有itertools
,你也不需要编写自己的组合函数:
from itertools import combinations_with_replacement
for i in combinations_with_replacement("0123",4):
print(i)
答案 3 :(得分:1)
chars = '0123456789abcdef'
def get_combinations(cur_combo=''):
for char in chars:
new_combo = cur_combo+char
if len(new_combo) == 4:
print new_combo
else:
get_combinations(new_combo)
get_combinations()
声明:
可能不是一个好例子,但它是递归的,并给出了正确的结果。