Link to home
Create AccountLog in
Avatar of megaapps
megaapps

asked on

How to write a pascals triangle in python using lists

Hi I need to know how to write a pascal triangle in python with a height parameter . So far all I have is the following code below. Or can someone explain how to get it.
def pascalsTri():
    userInput = raw_input("Please enter height")
    height = int(userInput)
    triangle = []
    for row in range(0,height+1):
      triangle.append(row)

Open in new window

Avatar of gelonida
gelonida
Flag of France image

I won't write the solution, but just give you a few hints.
This sounds like an exercise and if I wrote the entire solution it won't be fun anymore.

First question you have to ask yourself is:
do you really want to store the entire triangle in the variable triangale or do you want just to
print the triangle row by row.

Next:

I would suggest a function, that will calculate the next row if you give it the previous one.


def mk_next_row(previous_row):
   # calculate next row
  return new_row


the very first time you call the function you give it the first row and it will return the second

the next tine you cll it you give it the second row and it will return the first


so you should call
the first row is [ 1 ]
so
mk_next_row( [ 1 ] )
should return
[1, 1]

mk_next_row( [ 1 , 1] )
should return
[1, 2, 1]

mk_next_row( [ 1 , 2,  1] )
[1, 3, 3, 1]

how do you calculate a new row?

first new element
will be 1
the next one will be the some of the first and second element of the previous row
tje next one the sum of the second and third element
. . .
second last one is the some of the second last and the last element of the previous row

and the last element will be a 1


I hope this gives you some ideas.

Don't hesitate to ask further question in case my explanations don't put you on the right path


Avatar of megaapps
megaapps

ASKER

Here are the directions of the assignment. I just don't know how to write it in code.


Take the input of the height from the user
Assign a list to be empty to represent the entire triangle.
For each row of the triangle from 0 to the height+1
Assign a list to be empty to represent one new row of the triangle.
If the new row is at a height of zero,
make the new row to be a [1].
Else…if
the new row is at height of one, make the new row to be [1, 1].
Else..
for each column in the row from 0 to the current height of the row plus one.
If the column of this row is 0,
append a 1 to the new row
Else…if the column of this row is equal to the height of the row,
append a 1 to the new row
Else…
the value for this position are stored in the triangle, the value stored at
one row up and one column back plus the value stored at one row up
and the same column.
Append this value to the new row.
After the if statements are finished, append the new row list to the triangle list.
When the outermost for loop is complete, print the triangle list
I would have implemented the code differently, but they seem to dictated what
you have to do.
Well here some more suggestions:

Well, they really dictate how to do your work:

So what I would do is

triangle = []

for row_number in range(0,height+1):
    new_row = mk_row(triangle, row_number)
    triangle.append(new_row)


then write the funtion mk_row(), (you have t write it in the lines before the above for loop)

def mk_row(triangle, row_number):
    #If the new row is at a height of zero,
    if row_number == 0:
        row = [ 1 ]
    elif row_number == 1:
        #Else…if
        #the new row is at height of one, make the new row to be [1, 1].
    else:
    #Else..
         row = []
         #for each column in the row from 0 to the current height of the row plus one.
         #If the column of this row is 0,
              #append a 1 to the new row
         # Else…if the column of this row is equal to the height of the row,
               #append a 1 to the new row
        #Else…
              # the value for this position are stored in the triangle, the value stored at
              #one row up and one column back plus the value stored at one row up
              # and the same column.
             value = # what they told you above
             # Append this value to the new row.
    return row









This is what I have. And it is not working.
def pascalsTri():
    userInput = raw_input("Please enter height")
    height = int(userInput)
    triangle = []
#----------------------------------------------------------------------
def mk_row(triangle,row_number):
 if row_number == 0:
   row = [1]
 elif row_number == 1:
    new_row == [1,1]
 else:
    row=[]
    for row in range(0,height+1):
      new_row = mk_row(triangle,row_number)
      triangle.append(new_row)

    return  row

Open in new window

The most important task is to divide your problem into smaller problems

So create at first the function main()
asking you the height of the triangle
then let it calculate the triangle
then print it

def main():
    """  THE main function. asks for user nput
         calculates pascals triangle and prints it
    """
    userInput = raw_input("Please enter height: ")
    height = int(userInput)
    triangle = pascals_tri(height)
    print_triangle(triangle)

Now you can create the function to print the triangle
def print_triangle(triangle):
    """ very simple function with bad formatting
        to print out a pascals triangle
    """
    for row in  triangle:
        print row


Now write the function to create pascals trinalge
(assuming you could implement a function, that calculates a new row)

def pascals_tri(height):
    """ Function to calculate a pascals triangle with max_rows """
    triangle = []
    for row_number in range(0,height+1):
        print "T:",triangle
        row = mk_row(triangle,row_number)
        triangle.append(row)
    return triangle

Now the only function that is missing is the function,
that creates a new row of a triangle assuming you know the row
number and you calculated already the above rows.

def mk_row(triangle, row_number):
    """ function creating a row of a pascals triangle
        parameters:
            triangle: list of rows of the triangle,
                      that were calculated so far
            row_number: the new row to be calculated
    """
    #If the new row is at a height of zero,
    if row_number == 0:
        row = [ 1 ]
    elif row_number == 1: #Else if
        #the new row is at height of one, make the new row to be [1, 1].
    else: #Else..
        row = []
       ### ADD YOUR CODE HERE
        #for each column in the row from 0 to the current
           # height of the row plus one.
            if  col == 0:
            #If the column of this row is 0,
                 #append a 1 to the new row
                 row.append(1)
            # ADD YOUR CODE HERE
            # Else if the column of this row is equal to the height of the row,
                  #append a 1 to the new row
                  # ADD YOUR CODE HERE
            else: #Else
                 # the value for this position are stored in the triangle,
                 # the value stored at
                 #one row up and one column back plus the value stored at
                 # one row up
                 # and the same column.
                #value = # what they told you above
                value = . . . # PLEASE COMPLETE LINE
                # Append this value to the new row.
                row.append(value)
    return row

Last but not least you have to call the man function.

It is commun practice in python to do something like that

if __name__ == "__main__":
    main()



attached some code, that you had to complete.






#!/usr/bin/env python

def main():
    """  THE main function. asks for user nput
         calculates pascals triangle and prints it
    """
    userInput = raw_input("Please enter height: ")
    height = int(userInput)
    triangle = pascals_tri(height)
    print_triangle(triangle)

def print_triangle(triangle):
    """ very simple function with bad formatting 
        to print out a pascals triangle 
    """
    for row in  triangle:
        print row

def pascals_tri(height):
    """ Function to calculate a pascals triangle with max_rows """
    triangle = []
    for row_number in range(0,height+1):
        print "T:",triangle
        row = mk_row(triangle,row_number)
        triangle.append(row)
    return triangle

def mk_row(triangle, row_number):
    """ function creating a row of a pascals triangle 
        parameters: 
            triangle: list of rows of the triangle,
                      that were calculated so far
            row_number: the new row to be calculated
    """
    #If the new row is at a height of zero,
    if row_number == 0:
        row = [ 1 ]
    elif row_number == 1: #Else if
        #the new row is at height of one, make the new row to be [1, 1].
    else: #Else..
        row = []
        for col in # COMPLETE
        #for each column in the row from 0 to the current 
           # height of the row plus one.
            if  col == 0:
            #If the column of this row is 0,
                 #append a 1 to the new row
                 row.append(1)
            # ADD YOUR CODE HERE
            # Else if the column of this row is equal to the height of the row,
                  #append a 1 to the new row
                  # ADD CODE HERE
            else: #Else
                 # the value for this position are stored in the triangle, 
                 # the value stored at
                 #one row up and one column back plus the value stored at 
                 # one row up
                 # and the same column.
                #value = # what they told you above
                value = . . . # COMPLETE LINE
                # Append this value to the new row.
                row.append(value)
    return row

if __name__ == "__main__":
    main()

Open in new window

Hi can you do an example in one function because this is kinda confusing.
Completed code.
Just look for the lines marked with " # NEW LINE" to see what I added.


#!/usr/bin/env python

def main():
    """  THE main function. asks for user nput
         calculates pascals triangle and prints it
    """
    userInput = raw_input("Please enter height: ")
    height = int(userInput)
    triangle = pascals_tri(height)
    print_triangle(triangle)

def print_triangle(triangle):
    """ very simple function with bad formatting 
        to print out a pascals triangle 
    """
    for row in  triangle:
        print row

def pascals_tri(height):
    """ Function to calculate a pascals triangle with max_rows """
    triangle = []
    for row_number in range(0,height+1):
        #print "T:",triangle
        row = mk_row(triangle,row_number)
        triangle.append(row)
    return triangle

def mk_row(triangle, row_number):
    """ function creating a row of a pascals triangle 
        parameters: 
            triangle: list of rows of the triangle,
                      that were calculated so far
            row_number: the new row to be calculated
    """
    #If the new row is at a height of zero,
    if row_number == 0:
        row = [ 1 ]
    elif row_number == 1: #Else if
        #the new row is at height of one, make the new row to be [1, 1].
        row = [1, 1] # NEW LINE
    else: #Else..
        row = []
        for col in range(0, row_number + 1): # NEW LINE
        #for each column in the row from 0 to the current 
           # height of the row plus one.
            if  col == 0:
            #If the column of this row is 0,
                 #append a 1 to the new row
                 row.append(1)
            # Else if the column of this row is equal to the height of the row,
            elif col == row_number: # NEW LINE
                  #append a 1 to the new row
                 row.append(1) # NEW LINE
            else: #Else
                 # the value for this position are stored in the triangle, 
                 # the value stored at
                 #one row up and one column back plus the value stored at 
                 # one row up
                 # and the same column.
                #value = # what they told you above
                value = triangle[row_number-1][col-1] + triangle[row_number-1][col] # NEW LINE
                # Append this value to the new row.
                row.append(value)
    return row

if __name__ == "__main__":
    main()

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of gelonida
gelonida
Flag of France image

Link to home
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
See answer