最后,我想把这个解决方案推广到任意长度的元组中。我认为递归是必要的,但我一直无法做到。
def combineRanges(maxValues) :
for x in range(0, maxValues[0]) :
for y in range(0, maxValues[1]) :
for z in range(0, maxValues[2]) :
print (str(x) + '-' + str(y) + '-' + str(z));
m = (6,9,20);
combineRanges(m);
http://repl.it/WiZ
发布于 2014-08-12 16:29:39
这里不需要递归;您可以使用itertools.product
、map
和tuple解包:
from itertools import product
def combine_ranges(max_values):
for t in product(*map(range, max_values)):
print("-".join(map(str, t)))
一个简短的例子:
>>> combine_ranges((2, 2, 2, 2))
0-0-0-0
0-0-0-1
0-0-1-0
0-0-1-1
0-1-0-0
0-1-0-1
0-1-1-0
0-1-1-1
1-0-0-0
1-0-0-1
1-0-1-0
1-0-1-1
1-1-0-0
1-1-0-1
1-1-1-0
1-1-1-1
注意佩普-8-compliant名称的使用。
发布于 2014-08-12 18:08:28
递归并不是必需的,但它是执行未知级别嵌套循环的最清晰的方法之一。在输入元组中,每个元素只使用一个级别的堆栈,因此您有相当大的喘息空间。
对于递归函数,您需要一个基本案例和一个递归案例。基本情况是元组中有零个元素,这就是打印结果的地方。递归的情况是执行每个嵌套循环并将结果附加到下面的级别。
def combineRanges(maxValues, result=()):
if len(maxValues) is 0:
print("-".join(result))
return
for x in range(0, maxValues[0]):
combineRanges(maxValues[1:], result + (str(x),))
每个递归调用从maxValues
前面提取一个元素,并向result
元组添加一个结果,直到maxValues
为空。这种类型的递归有点棘手,因为您在一个参数中积累了结果,但是这种模式非常有用,而且出现了很多,因此值得学习。而且,python的列表不是不变的,这就是为什么我使用tuple来保存结果的原因。
https://softwareengineering.stackexchange.com/questions/253077
复制相似问题