Using Recursion to check for sum of tuples in a list

I have a func which takes a list of tuples, each tuple contains two items: item name and value. I need the func to return True if it’s possible to divide the tuple list into two equal valued groups and False otherwise. The function should be recursive and should not use any loops.

for example,

func([('tree', 500), ('keyboard', 200), ('pen', 300)])

should result in True, because the value of keyboard + pen = tree and it can be divided into two equal groups.

So far, what I managed to write is:

def func(lst):
if len(lst) == 1 or len(lst) == 0:
    return False
elif len(lst) == 2:
    if lst[0][1] != lst[1][1]:
        return False
    else:
        return True

But it only covers the basic cases. Any help would be appreicated.

Answer

Not very efficient for big lists, but I assume it is recursive because of school work:

def divide(lst, left_sum, right_sum):
    # if no more elements,
    # then it is true if  left_sum == right_sum else false
    if not lst:
        return left_sum == right_sum

    obj, value = lst[0]
    # element can go either left or right
    return divide(lst[1:],left_sum + value, right_sum) or divide(lst[1:],left_sum, right_sum+value)

assert divide([('tree', 500), ('keyboard', 200), ('pen', 300)],0,0)
assert not divide([('tree', 500), ('keyboard', 200), ('pen', 301)],0,0)

Leave a Reply

Your email address will not be published. Required fields are marked *