home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
procs
/
pascltri.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
2KB
|
55 lines
############################################################################
#
# File: pascltri.icn
#
# Subject: Procedure to compute a row of Pascal's Triangle
#
# Author: Erik Eid
#
# Date: August 7, 1997
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# The procedure, when invoked by a call to PascalsTriangle(n), returns
# the nth row of Pascal's Triangle in list form. Pascal's Triangle is a
# mathematical structure in which each element of a row is the sum of the
# two elements directly above it. The first few levels are:
#
# Row 1: 1 Triangle stored as: [[1],
# 2: 1 1 [1, 1],
# 3: 1 2 1 [1, 2, 1],
# 4: 1 3 3 1 [1, 3, 3, 1],
# 5: 1 4 6 4 1 [1, 4, 6, 4, 1]]
#
# For example, PascalsTriangle(4) would return the list [1, 3, 3, 1].
#
# The procedure fails if n is not an integer or if it is less than one.
#
############################################################################
procedure PascalsTriangle(level) #: Pascal triangle row
static tri
local row, elem, temp
initial tri := [[1], [1, 1]] # Start with first two rows stored
if not (level = integer(level)) then fail
if level < 1 then fail
if level > *tri then # If we haven't calculated this
# row before, then do so and keep
# it statically to prevent having
# to do so again.
every row := *tri+1 to level do {
temp := [1] # First element of any row is 1.
every elem := 2 to row-1 do # Each of the next elements is
put (temp, tri[row-1][elem-1] + # the sum of the two above it.
tri[row-1][elem])
put (temp, 1) # Last element of any row is 1.
put (tri, temp) # Attach this row to the triangle.
}
return tri[level] # Return the chosen level.
end