解决方案 1. 暴力递归并删除重复项
您可以使用set 消除重复。
但是你不能使set 的lists 因为list 是不可散列的。
为了提高效率,你可以先收集索引对,然后切片:
def num_sub_array(array):
return [
array[i:j] for i, j in build_pair_set(0, len(array))
]
def build_pair_set(start: int, end: int) -> set:
return set() if start == end else (
{(start, end)}
| build_pair_set(start + 1, end)
| build_pair_set(start, end - 1)
)
print(sorted(num_sub_array([1, 2, 3, 4])))
输出:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
解决方案 2. 无冗余递归
def num_sub_array(array):
if not array:
return []
return [array[i:] for i in range(len(array))] + num_sub_array(array[:-1])
print(sorted(num_sub_array([1, 2, 3, 4])))
输出:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
实际上,解决方案 2 的 num_sub_array 有一个尾递归。所以你可以把它改成循环。
解决方案 3. 循环
def num_sub_array(array):
return [
array[i:j]
for i in range(len(array))
for j in range(i + 1, len(array) + 1)
]
print(sorted(num_sub_array([1, 2, 3, 4])))
输出:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
我使用sorted 来比较两种方法。没必要。