Pascal's Triangle for Python

后端 未结 11 1521
轮回少年
轮回少年 2020-11-30 06:13

As a learning experience for Python, I am trying to code my own version of Pascal\'s triangle. It took me a few hours (as I am just starting), but I came out with this code:

相关标签:
11条回答
  • 2020-11-30 06:46

    I am cheating from the popular fibonacci sequence solution. To me, the implementation of Pascal's triangle would have the same concept of fibonacci's. In fibonacci we use a single number at a time and add it up to the previous one. In pascal's triangle use a row at a time and add it up to the previous one.

    Here is a complete code example:

    >>> def pascal(n):
    ...     r1, r2 = [1], [1, 1]
    ...     degree = 1
    ...     while degree <= n:
    ...         print(r1)
    ...         r1, r2 = r2, [1] + [sum(pair) for pair in zip(r2, r2[1:]) ] + [1]
    ...         degree += 1
    

    Test

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

    Note: to have the result as a generator, change print(r1) to yield r1.

    0 讨论(0)
  • 2020-11-30 06:52

    I know you want to implement yourself, but the best way for me to explain is to walk through an implementation. Here's how I would do it, and this implementation relies on my fairly complete knowledge of how Python's functions work, so you probably won't want to use this code yourself, but it may get you pointed in the right direction.

    def pascals_triangle(n_rows):
        results = [] # a container to collect the rows
        for _ in range(n_rows): 
            row = [1] # a starter 1 in the row
            if results: # then we're in the second row or beyond
                last_row = results[-1] # reference the previous row
                # this is the complicated part, it relies on the fact that zip
                # stops at the shortest iterable, so for the second row, we have
                # nothing in this list comprension, but the third row sums 1 and 1
                # and the fourth row sums in pairs. It's a sliding window.
                row.extend([sum(pair) for pair in zip(last_row, last_row[1:])])
                # finally append the final 1 to the outside
                row.append(1)
            results.append(row) # add the row to the results.
        return results
    

    usage:

    >>> for i in pascals_triangle(6):
    ...     print(i)
    ... 
    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    
    0 讨论(0)
  • 2020-11-30 06:53

    Beginner Python student here. Here's my attempt at it, a very literal approach, using two For loops:

    pascal = [[1]]
    num = int(input("Number of iterations: "))
    print(pascal[0]) # the very first row
    for i in range(1,num+1):
        pascal.append([1]) # start off with 1
        for j in range(len(pascal[i-1])-1):
        # the number of times we need to run this loop is (# of elements in the row above)-1
            pascal[i].append(pascal[i-1][j]+pascal[i-1][j+1])
            # add two adjacent numbers of the row above together
        pascal[i].append(1) # and cap it with 1
        print(pascal[i])
    
    0 讨论(0)
  • 2020-11-30 06:53

    Here is an elegant and efficient recursive solution. I'm using the very handy toolz library.

    from toolz import memoize, sliding_window
    
    @memoize
    def pascals_triangle(n):
        """Returns the n'th row of Pascal's triangle."""
        if n == 0:
            return [1]
        prev_row = pascals_triangle(n-1)
        return [1, *map(sum, sliding_window(2, prev_row)), 1]
    

    pascals_triangle(300) takes about 15 ms on a macbook pro (2.9 GHz Intel Core i5). Note that you can't go much higher without increasing the default recursion depth limit.

    0 讨论(0)
  • 2020-11-30 06:53

    Here is a simple way of implementing the pascal triangle:

    def pascal_triangle(n):
        myList = []
        trow = [1]
        y = [0]
        for x in range(max(n,0)):
            myList.append(trow)
            trow=[l+r for l,r in zip(trow+y, y+trow)]
    
        for item in myList:
            print(item)
    
    pascal_triangle(5)
    

    Python zip() function returns the zip object, which is the iterator of tuples where the first item in each passed iterator is paired together, and then the second item in each passed iterator are paired together. Python zip is the container that holds real data inside.

    Python zip() function takes iterables (can be zero or more), makes an iterator that aggregates items based on the iterables passed, and returns the iterator of tuples.

    0 讨论(0)
提交回复
热议问题