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.

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.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`

.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.