Yesterday Rick Wicklin showed a cool SAS/IML function to use a matrix and print a Pascal’s triangle. I come up with an alternative solution by using a vector in SAS/IML.

### Method

Two functions are used, including a main function

`PascalRule`

and a helper function `_PascalRule`

. The helper function recycles the vector every time and fills the updated values; the main function increases the length of the vector from 1 to n.### Pro

Get the nth row directly, for example, return the 10th row by

`PascalRule(10)`

; no need to use a matrix or matrix related operators; use less memory to fit a possibly bigger `n`

.### Con

More lines of codes; slowlier to print the triangle, since there is no data structure such as matrix to remember the transient numbers.

```
proc iml;
/* The main function */
start PascalRule(n);
if n <= 1 then
return({1});
answer = {1, 1};
do i = 1 to n - 2 ;
answer = _PascalRule(answer);
end;
return(answer);
finish;
/* The helper function */
start _PascalRule(vector);
previous = 1;
do i = 2 to nrow(vector);
current = vector[i];
vector[i] = previous + current;
previous = current;
end;
vector = vector // {1};
return(vector);
finish;
/* Print the pascal's triangle */
do i = 1 to 10;
x = PascalRule(i);
x = x`;
print x;
end;
quit;
```

Theoretically, Rick’s solution has a time complexity of

`O(N^2)`

and a space complexity of `O(N^2)`

, while my solution has a time complexity of `O(N^3)`

(unfortunately have to use three times of `do loop`

in IML) and a space complexity of `O(N)`

. Actually it's a trade-off between speed and memory cost.