Возвращает массив или логическое значение? - PullRequest
0 голосов
/ 02 марта 2020

Учитывая массив целых чисел, найдите любую одну комбинацию из четырех элементов в массиве, чья сумма равна заданному значению X. Мне нужно вернуть массив всех подмассивов, проверяющих условие, которое я хотел решить, в рекурсивным способом я могу вернуть, является ли конечное условие Истинным или Ложным, но не возвращая массив длины 4 и сумму = X)

def function(array, target):
    if len(array) == 4:
        if sum(array) == target:
            return True
        else:
            return False
    return function(array[1:], target) or function(array[:-1], target)

Это возвращает Ложь для массива: [7, 4, 6, -1, 1, 2] Вместо Правда

Ответы [ 3 ]

1 голос
/ 02 марта 2020

Рекурсия не является хорошим способом для продолжения, так как вы не хотите применять ту же функцию к «уменьшенным» массивам. Вы хотите проверить все комбинации, поэтому я настоятельно рекомендую использовать itertools.

itertools.combinations(my_array, my_length) делает все возможные комбинации my_array элементов с длиной my_length, без повторений (что означает, что порядок не важно, у вас не будет ни [a, b], ни [b, a])

from itertools import combinations
L = [1, 2, 3, 4, 5, 1]
target = 10

for i in combinations(L, 4):
    if sum(i) == target:
        print(i)

Вывод:

(1, 2, 3, 4)
(1, 3, 5, 1)
(2, 3, 4, 1)
0 голосов
/ 02 марта 2020

Я не уверен, правильно ли я понимаю ваш вопрос - я понимаю, что вы хотели бы вернуть массив и целевое значение в случае, если длина массива действительно равна 4 и целевое значение действительно достигнуто. Для этой проблемы, я предполагаю следующее дополнение к вашему коду:

def function(array, target):
if len(array) == 4:
    if sum(array) == target:
        return True
    else:
        return False

# Now this part returns array and target in case your provided conditions hold
if function(array, target) == True:
    print(array, target)

Правильно ли я понял ваш вопрос?

0 голосов
/ 02 марта 2020

Вы можете использовать модуль itertools в python, особенно функцию itertools.combinations.

Попробуйте:

import itertools

def function(array, target):
    for comb in itertools.combinations(array, 4):
        if sum(comb) == target:
            return list(comb)
    return False

print(function([1, 2, 3, 5, 6, 7, 0, 9, 2], 8)) # ---> Returns array of length 4
print(function([1, 2, 3, 5, 6, 7, 0, 9, 2], 35)) # ---> Returns False No such combination available

Вывод:

[1, 2, 3, 2]
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...