パスカルの三角形の横列

パスカルの三角形があって、

0:              1
1:            1   1
2:          1   2   1
3:        1   3   3   1
4:      1   4   6   4   1
5:    1   5  10  10   5   1
6:  1   6  15  20  15   6   1

横列を求めたい。


例えば、6の横列を求めたいとする。

1はとりあえず置いといて。

6/1倍して、6
5/2倍して、15
4/3倍して、20
3/4倍して、15
2/5倍して、6
1/6倍して、1


漸化式にすると、

nC1 = 1
nCr = (n - r + 1) * nC(r-1) / r

何気なく使ってたんだけど、分解してみると凄いアルゴリズムだったんだなぁと思ってみた。


下降階乗冪と上昇階乗冪をうまく組み合わせてる訳だ。


反復と折り返しを付けて高速化してみた。反復は訳ありなんだけど。

(define (combi n r)
  (letrec ((end (- (quotient n 2)
                   (abs (- r (quotient n 2)))))
           (iter (lambda (acc i)
                   (if (> i end)
                       acc
                       (iter (/ (* (+ (- n i) 1) acc) i)
                              (+ i 1))))))
          (iter 1 1)))

絶対値を使えばifがいらない。絶対値もおもろいな。