решение 1. Грубая рекурсия и удаление дубликатов
Вы можете устранить дублирование, используя set
.
Но вы не можете сделать set
из list
с, так как 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])))
output:
[[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
имеет хвостовую рекурсию. Таким образом, вы можете изменить его на l oop.
Решение 3. L oop
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
для сравнения двух методов. Это не обязательно.