Сумма чисел - PullRequest
       95

Сумма чисел

0 голосов
/ 12 февраля 2020

Я делал программу, которая находит два числа в случайном списке и печатает их, если их сумма равна 8. Честно говоря, я сижу здесь полчаса и думаю, что происходит. Я думаю, что я довольно близок, но в редких случаях он не находит комбинацию выхода (list = [1,4,4,9] -> Нет комбинации). Также в редких случаях я получаю сообщение об ошибке:

RecursionError: maximum recursion depth exceeded in comparison

Вот мой код:

import random
list = []
for i in range(1,5,1):
    newNum = random.randint(1,10)
    list.append(newNum)
list.sort()
sum = 8
print('\nRandomly generated list:')
print(list)
firstNum = list[0]
lastNum = list[-1]
newList = []
def isSum(a,b):
    if a + b == sum:
        if list.index(a) == list.index(b):
            print('\nThere isnt a combination.')
        else:
            newList.append(a)
            newList.append(b)
            print('\nCombination:')
            print(newList)
    elif a + b < sum:
        temp = list.index(a)
        temp += 1
        if temp > list.index(lastNum):
            print('\nThere isnt a combination.')
        else:
            a = list[temp]
            isSum(a,b)
    else:
        temp = list.index(b)
        temp -= 1
        if temp < list.index(firstNum):
            print('\nThere isnt a combination.')
        else:
            b = list[temp]
            isSum(a,b)
isSum(firstNum,lastNum)

Я просто новичок, не сердитесь, если я сделал глупая ошибка: 3

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Рекурсия действительно не идеальна в Python, и ваш код, безусловно, может быть упрощен.


Это должно вернуть все пары.

import itertools as itt
import random
from typing import List, Tuple


def is_comb_sum(nums: List[int], comb_size: int, target_sum: int) -> List[Tuple[int, ...]]:
    combs = []
    for curr_pair in itt.combinations(nums, comb_size):
        curr_sum = sum(curr_pair)
        if curr_sum == target_sum:
            combs.append(curr_pair)
    return combs


nums_list = [random.randint(0, 10) for _ in range(5)]

print(nums_list)

res = is_comb_sum(nums_list, 2, 8)

print(res)
0 голосов
/ 13 февраля 2020

Если вы хотите распечатать каждую комбинацию только один раз, вы можете использовать набор для идентификации имеющихся чисел. Затем для каждого из этих чисел вы определяете, какое дополняющее значение необходимо для достижения вашей цели (8), и если оно также есть в наборе, то пара существует. Единственным исключением является случай, когда число составляет ровно половину цели (т.е. 4), и в этом случае вы должны убедиться, что в списке есть как минимум два экземпляра этого числа:

target  = 8
count   = 4

numbers = [random.randint(1,10) for _ in range(count)]    
print(numbers)

numberSet = set(numbers)
for number in numberSet:
    other = target-number
    if other not in numberSet: continue
    if other > number: continue # avoid duplicates such as 2+6=8 and 6+2=8
    if other == number and numbers.count(number) < 2: continue
    print(number,"+",other,"=",target)

Вывод :

[7, 2, 6, 1]
6 + 2 = 8
7 + 1 = 8

Если вы хотите распечатать все комбинации, вы можете использовать объект Счетчик из модулей сбора и либо распечатать число вхождений, либо повторить напечатанные строки:

target  = 12
count   = 8

numbers = [random.randint(1,10) for _ in range(count)]    
print(numbers)

from collections import Counter
numberCounts = Counter(numbers)
for number in numberCounts:
    other = target-number
    if other > number: continue
    pairCount  = numberCounts[number] * numberCounts[other]
    if number == other:
        pairCount = (pairCount - numberCounts[number]) // 2
    if pairCount > 0:
        print(number,"+",other,"=",target,"occurred",pairCount,"time(s)")

Вывод (цель 12 в списке из 8):

[7, 6, 5, 5, 6, 6, 3, 4]
7 + 5 = 12 occurred 2 time(s)
6 + 6 = 12 occurred 3 time(s)
0 голосов
/ 12 февраля 2020

Вы можете использовать модуль itertools для генерации всех комбинаций вашего списка, а затем отфильтровать его, рассчитав sum каждой комбинации, например:

import itertools


a = [1, 4, 4, 9]  # any list of nums
groups = 2
result = 8
combinations = [combination for combination in itertools.combinations(a, groups)]
output = [combination for combination in combinations if sum(combination) == result]

print(output)
>>> [(4, 4)]
...