SICP - Solution: Exercise 1.12
October 3, 2018
Exercise 1.12 #
The following pattern of numbers is called Pascal’s triangle.
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 . . .The numbers at the edge of the triangle are all 1, and each number inside the triangle is the sum of the two numbers above it. Write a procedure that computes elements of Pascal’s triangle by means of a recursive process.
Solution #
The solution is easier to understand if you change slightly the tabulation:
 1
 1   1
 1   2   1
 1   3   3   1
 1   4   6   4   1
       . . .
From the definition given, the function to compute a single number at a given position can be defined recursively:
(define (pascal row col)
  (cond ((= row 1) 1)
        ((or (= col 1) (= col row)) 1)
        (else (+ (pascal (- row 1)  (- col 1))
                 (pascal (- row 1) col)))))
Using this function, we write a couple more functions to display the triangle:
(define (display-pascal-row n)
  (define (column-iter i)
    (display (pascal n i)) (display "  ")
    (if (= i n)
        (newline)
        (column-iter (+ i 1))))
  (column-iter 1))
(define (display-pascal n)
  (define (display-pascal-iter i)
    (display-pascal-row i)
    (if (= i n)
        (newline)
        (display-pascal-iter (+ i 1))))
  (display-pascal-iter 1))
To check our solution, we can evaluate (display-pascal 14):
1  
1  1  
1  2  1  
1  3  3  1  
1  4  6  4  1  
1  5  10  10  5  1  
1  6  15  20  15  6  1  
1  7  21  35  35  21  7  1  
1  8  28  56  70  56  28  8  1  
1  9  36  84  126  126  84  36  9  1  
1  10  45  120  210  252  210  120  45  10  1  
1  11  55  165  330  462  462  330  165  55  11  1  
1  12  66  220  495  792  924  792  495  220  66  12  1  
1  13  78  286  715  1287  1716  1716  1287  715  286  78  13  1