SCIP 1.12を解いてみた

Exercise 1.12. The following pattern of numbers is called Pascal's triangle.

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.35 Write a procedure that computes elements of Pascal's triangle by means of a recursive process.

SCIPの1章だけの文法だけでクリアするのはちと骨が折れるので let*とlambdaとappendと…まあいいかできたから。 

>>(define pascalTriangle (lambda (n) (cond ((= n 1) '(1)) ((> n 1) ((lambda (x) (let* ((y (zip x (cdr x))) (a (map (lambda (z) (+ (car z) (cadr z))) y))) (append '(1) a '(1)))) (pascalTriangle (- n 1)))))))
=>pascalTriangle

>>(pascalTriangle 1)
=>(1)

>>(pascalTriangle 2)
=>(1 1)

>>(pascalTriangle 3)
=>(1 2 1)

>>(pascalTriangle 4)
=>(1 3 3 1)

>>(pascalTriangle 5)
=>(1 4 6 4 1)

>>(pascalTriangle 6)
=>(1 5 10 10 5 1)

ポイントになったのはひとつ前の数列をあたえられたときに両端の1以外を計算する部分。zipで着陸してしまった。
foldでできそうな気がしたのだが気合いが足りない。

>>((lambda (x) (let* ((y (zip x (cdr x))) (a (map (lambda (z) (+ (car z) (cadr z))) y))) (append '(1) a '(1))))  '(1 3 3 1) )
=>(1 4 6 4 1)

しまった、appendは準クオートでかくんだった。

>>(define pascalTriangle (lambda (n) (cond ((= n 1) '(1)) ((> n 1) ((lambda (x) (let* ((y (zip x (cdr x))) (a (map (lambda (z) (+ (car z) (cadr z))) y))) `(1 ,@a 1))) (pascalTriangle (- n 1)))))))