Hero Guy
Hero Guy

Reputation: 217

List append in recursion

I am unable to make a pascal triangle. I need to append to list elements in recursion, but the result of my work is list appending in list. Can u help me to do it? My testing code is:

def list(row):
    if(row is 0):
        return 0
    return [row, list(row-1)]

If I use it, I will return list in list. I need elements in list

print(list(10))

Output:

[10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]]

Expected output:

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Upvotes: 0

Views: 4641

Answers (5)

Achlys
Achlys

Reputation: 1

You can create a Pascal's triangle using the given way

def pascal(rows):
    for i in range (rows):
    value=1
    List = [value]
    for j in range (i):
        value = value * ( i-j ) * 1 / ( j + 1 )
        List.append(int(value))
    print(List)

pascal(5)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]

Upvotes: 0

Mulan
Mulan

Reputation: 135227

Regarding your specific function, here's one way you could write it

def foo (row):
  if row == 0:
    return [0]
  else:
    return [row] + foo (row - 1)

print(foo(10))
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Perhaps a more "pythonic" way of writing that would be

print([10 - x for x in range (0, 11)])
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Regarding pascal's triangle, here's one way you can write the program using an auxiliary helper and continuation passing style – for those wondering, this choice was made so that the result could be assembled in a straightforward manner and the recursive call is in tail position, meaning this function could easily be put on a trampoline to be made stack-safe if necessary

def sliding (n,xs):
  if n > len(xs):
    return []
  else:
    return [xs[0:n]] + sliding(n, xs[1:])

def pascal (n):
  def aux (m, prev, k):
    if n == m:
      return k([prev])
    else:
      return aux(m + 1, [1] + [x + y for (x,y) in sliding(2, prev)] + [1], lambda rest: k([prev] + rest))
  return aux(1, [1], lambda x: x)

for line in pascal(5):
  print(line)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]

Upvotes: 4

Szabolcs
Szabolcs

Reputation: 4086

You can create a recursive range function that outputs your expected results:

def rec_range(n):
    return [n] + rec_range(n-1) if n else [0]
>>> rec_range(10)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Hope it helps.

Or just use range (xrange in python2.x):

>>> list(range(10+1))[::-1]  # reverse the list
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Upvotes: 1

Adam S
Adam S

Reputation: 444

It sounds like you want to concatenate the list [x] with the list returned as a result of calling list(x-1). The nice thing about lists in python is that the + operator does exactly this. If we change the final return statement to return [x] + list(x-1) we're headed in the right direction. You'll then notice that you run into trouble when x is 0 becuase you cant add a list to an integer, so you'll want to change your base case to return [0]. Finally, as mentioned, it's best to avoid declaring names that overwrite python built in functions (list is one), so let's rename your function to my_list:

def my_list(row):
    if row == 0:
        return [0]
    return [row] + my_list(row-1)

This doesn't quite get you to pascal's triangle, but hopefully you're off on the right course.

Upvotes: 1

Snackoverflow
Snackoverflow

Reputation: 6271

What you want is probably this:

return [row] + list(row-1)

This creates a list with one element row and adds the other list on top of it.

Upvotes: 1

Related Questions