我需要创建一个函数,以便我可以输入两个参数,一个order和一个max,并返回所有列表'order'的列表,并且每个元素的范围从0到'max'。我怀疑我可能需要使用递归,但我迷失了。
所以order = 2 max = 3应该返回
[[0,0,0,0], [0,0,0,1], [0,0,0,2], ... [3,3,3,3]]
和order = 4,max = 5应返回
{{1}}
感谢您的帮助
答案 0 :(得分:2)
请注意,一般情况下,@ Prune的答案是首选武器。
至于递归:请求列表可以递归构造为
1
的列表是所有1
的列表 - 包含初始集中元素的元素列表: [1] -> [[1]]
[1, 2] -> [[1], [2]]
[1, 2, 3] -> [[1], [2], [3]]
在Python中:
l1 = [[item] for item in range(0, max + 1)]
ln1
长度为n + 1
的{{1}} ln
长度为n
l1
,其中ln1 = [a + b for a in combine(base, n - 1) for b in combine(base, 1)]
的元素按列表加入串联。在Python中:
def combinations(base, n):
if n == 0:
return []
elif n == 1:
return [[item] for item in base]
else:
return [a + b for a in combine(base, n - 1) for b in combine(base, 1)]
itertools.combinations_with_replacements()
fom
速度更快,内存效率更高。它也是一个现有的轮子,而不是一个新的轮子。
答案 1 :(得分:1)
你不需要递归;您只需要Python itertools包:
import itertools
num_list = [x for x in range(max+1)]
for one_combo in itertools.combinations_with_replacement(num_list, order):
...
当然,你可以结合两条计算线;这样看起来更容易。
答案 2 :(得分:1)
这是一个使用递归来解决问题的函数。当你处理递归时,请确保你有一个基本案例和一般情况。
def recurseNumbers(order, mx):
if order == 1:
return [[n] for n in range(mx + 1)]
else:
total_array = []
for num in range(mx + 1):
numbers = recurseNumbers(order - 1, mx)
for number in numbers:
total_array.append([num] + number)
return total_array
另请注意,Python列表添加使这相对简单。 ["a"] + ["b"] = ["a", "b"]