Search code examples
pythonfunctionrecursionsum

Summing objects in recursive python function


I need to sum objects (strings, ints, etc.) in one function (don't create other function, it can be done within one). It should work this way: When given my_sum([[['s'],'ta'],['c',['k']]]), it should return 'stack'.

I came up with this:

def my_sum(array):

    if not array: #empty array
        return None

    else:

        for item in array:

            if type(item) == list:
                my_sum(item)

            else:
                print(item)

It of course is not doing what it should be, I was just playing around with it trying to come up with something. This code above returns this:

s
ta
c
k

I think I am not that far from result as I have what I need, but here is the problem how can I sum up those items ? I can't write result = '' anywhere in the function and then return it, because it would be deleting every time there would be recursion call. Also I don't want global variables (if anyone would think of that). Maybe I am just being stupid and can't see that it is one simple thing, pardon me if it is so.

Thank you for every answer!


Solution

  • The common accumulating pattern is:

    result = <init value>
    for item in argument:
         result = result <operator> item
    return result
    

    (this can be written more concisely, but that's not the point for now).

    Applied to your problem:

    def my_sum(items):
        result = ''
        for item in items:
            if type(item) == list:
                result += my_sum(item)
            else:
                result += item
        return result
    

    Note that type(x) == y is frowned upon in Python, isinstance is considered better style.

    Homework: extend the function so that it works for these arguments too:

    print my_sum([[['s'],'ta'],('c',('k')), {('over'), ('flow')}])