Python Forum
Sum of elements on the list recursive
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Sum of elements on the list recursive
#1
Hi,
my homework is to create a program which sums elements of the list (from current index to the last) and inserts its result to the appropriate cell on the new list.
I have to do it in both ways, 1 - iteration, 2 - recursive.
Now the iteration version works flawlessly, but recursive takes the cut of already cut list. How to prevent it to make the recursive function the cut of original list in every step?

A=[1,0,2,0,0,3,1,3,2,1]

def iter_45(lista):
    nowa_lista_i = []
    for i in range (0, len(lista)):
        suma_elementow = 0
        for i in range(i, len(lista)):
            suma_elementow += lista[i]
        
        nowa_lista_i.append(suma_elementow)
    return nowa_lista_i


i = 0
dlugosc = len(A)
nowa_lista = []

def req_45(lista):
    global i
    if i == (dlugosc):
        return nowa_lista
    else:

        nowa_lista.append(sum(lista[i:]))
        i += 1              
        return req_45(lista[i:])


print('iteracyjnie:\n')
print(iter_45(A))
print('\nrekurencyjnie:\n')
print(req_45(A))
Reply
#2
Hi,

Quote:which sums elements of the list (from current index to the last)
Your current code doesn't reflect that, as you always start at the 1st element?

Quote: and inserts its result to the appropriate cell on the new list.
What does that means exactly? Does mean if your input list is [1, 2, 3, 4], the result list is supposed to be [3, 6, 10]?

Except this, iteration by for i in range(len(iterable)) combined with accessing elements of iterable by index is an bad anti-pattern in Python. Python supports direct iteration of iterables.

And your variable names are pretty weird... why do you have at nearly all variables the letter a post-fixed?

Regards, noisefloor
Reply
#3
I deduct that if your 'iteration version works flawlessly' then objective is:

[1,0,2,0,0,3,1,3,2,1] --> [13, 12, 12, 10, 10, 10, 7, 6, 3, 1]

I think that your solution is too complicated.

Lists support sum(), so:

>>> sum([1, 2])
3
Lists also support slicing:

>>> a = [1, 2, 3, 4, 5]
>>> a[1:]
[2, 3, 4, 5]
>>> sum(a[1:])
14
Combining those two things into list comprehension and taking into account noisefloor comment about Python antipattern you can write simply:

>>> a = [1,0,2,0,0,3,1,3,2,1] 
>>> [sum(a[i:]) for i, v in enumerate(a)]
[13, 12, 12, 10, 10, 10, 7, 6, 3, 1]
Iterative solution should give you pretty good idea how to proceed with recursive solution.

EDIT: how Python core developers do it

There is built-in module itertools which have function accumulate (Make an iterator that returns accumulated sums).

There is rough equivalent provided:

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    yield total
    for element in it:
        total = func(total, element)
        yield total
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#4
Thank you guys for the advices, I have now completed my task, by adding another argument to the recursive function, and now I send full list instead of a slice to the function. I have also simplified the iteration version of the function.

noisefloor,
I wanted to achieve what was made by iter_45 function, like you mentioned, but opposite way:
Input: [1, 2, 3, 4], output [10, 6, 3].
The supplement at the end of my variable names is just my ID required by the teacher, it doesn't mean anything :)

I know it could be simplier and/or better, but now it looks like this:
A=[1,0,2,0,0,3,1,3,2,1]

def iter_45(lista):
    nowa_lista_i = []
    for i in range (0, len(lista)):
        nowa_lista_i.append(sum(lista[i:]))
    return nowa_lista_i


nowa_lista = []
i = 0

def req_45(lista, i):
    global nowa_lista
    
    if i == len(lista):
        return nowa_lista

    else:
        nowa_lista = nowa_lista + [sum(lista[i:])]
        i += 1
        return req_45(lista, i)


print('iteracyjnie:\n')
print(iter_45(A))
print('\nrekurencyjnie:\n')
print(req_45(A,0))
Thanks again for help :)
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  help with adding duplicates elements together in a list 2ECC3O 5 1,971 Sep-10-2022, 07:11 AM
Last Post: 2ECC3O
  Unexpected behavior accessing list elements. tonyflute 2 2,222 Apr-09-2021, 02:36 PM
Last Post: tonyflute
  How to find difference between elements in a list? Using beginner Basics only. Anklebiter 8 4,254 Nov-19-2020, 07:43 PM
Last Post: Anklebiter
  Get 5 most unique combinations of elements in a 2D list wanttolearn 1 2,280 Sep-24-2020, 02:26 PM
Last Post: buran
  Loop through elements of list and include as value in the dictionary Rupini 3 2,588 Jun-13-2020, 05:43 AM
Last Post: buran
  How can I print the number of unique elements in a list? AnOddGirl 5 3,194 Mar-24-2020, 05:47 AM
Last Post: AnOddGirl
  Help with Recursive solution,list items gianniskampanakis 8 3,506 Feb-28-2020, 03:36 PM
Last Post: gianniskampanakis
  Extracting elements in a list to form a message using for loop Tony04 2 2,325 Oct-25-2019, 05:55 PM
Last Post: ichabod801
  Recursive Function - Compare 2 lists, return the elements that don't exist in both KellyBaptist 1 5,179 Dec-23-2018, 10:10 AM
Last Post: Gribouillis
  Storing Minimum List of values from a recursive function sigsegv22 1 2,499 Sep-10-2018, 01:25 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020