Генерация всевозможных интервалов целых чисел - PullRequest
0 голосов
/ 26 февраля 2019

Несмотря на мои исследования, я не нашел решения своей проблемы.Спасибо за вашу помощь!

Пусть a и b, два целых числа.Я хочу сгенерировать все подинтервалы целых чисел независимо от их длины между этими двумя целыми числами.

Например, пусть a = 2 и b = 5, результат, который я пытался получить:

[
 [[2],[3],[4],[5]
 [[2,5]],
 [[2],[3,5]],
 [[2],[3,4],[5]],
 [[2],[3],[4,5]],
 [[2,3],[4,5]],
 [[2,3],[4],[5]],
 [[2,4],[5]]
]

Спасибо за помощь,

С уважением!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете использовать функцию, которая возвращает интервалы от чисел, ближайших к a (что само по себе a) до b, а затем рекурсивно возвращает интервалы от a + 1 до b:

def intervals(a, b):
    if a > b:
        yield []
    for i in range(a, b + 1):
        for interval in intervals(i + 1, b):
            yield [[a] if a == i else [a, i], *interval]

так что:

list(intervals(2, 5))

возвращает:

[[[2], [3], [4], [5]],
 [[2], [3], [4, 5]],
 [[2], [3, 4], [5]],
 [[2], [3, 5]],
 [[2, 3], [4], [5]],
 [[2, 3], [4, 5]],
 [[2, 4], [5]],
 [[2, 5]]]
0 голосов
/ 26 февраля 2019

Я написал метод, который делает то, что вы просили.На это не очень приятно смотреть, но он делает свою работу.

def subIntervals(a,b):
    outputList = [[[a]]]
    for n in range(a+1, b+1):
        newOutputList = []
        for e in outputList:
            newOutputList.append(e + [[n]])
            newOutputList.append(e[:-1] + [[e[-1][0], n]])
        outputList = newOutputList
    return outputList

Я добавлю объяснение, если необходимо.

...