2001/??/??

パスカルの三角形

適当な大きさのパスカルの三角形を出力するスクリプトを作ってみましょう。

I:\www>jperl pascal01.pl
 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

ヒント:
@nという配列を用意します。最初の段階では、

    @n = (1)
ですが、これを順次
    @n = (1, 1)
    @n = (1, 2, 1)
    @n = (1, 3, 3, 1)
    @n = (1, 4, 6, 4, 1)
    @n = (1, 5, 10, 10, 5, 1)
    .....
のように変化させていきます。
    $n[0](=1), $n[1], ......, $n[$k-1], $n[$k](=1)
を次の段に変化させるには、まず配列の要素をひとつ追加します: $n[$k+1] = 0;
配列は次のようになりました。
    $n[0](=1), $n[1], ......, $n[$k-1], $n[$k](=1), $n[$k+1](=0)
これらを右側から順に変えていきます:
    $n[$k+1] += $n[$k]  ;
    $n[$k]   += $n[$k-1];
    $n[$k-1] += $n[$k-2];
    ......
    $n[1]    += $n[0]   ;
$n[0] を変える必要はありません。

このままでは綺麗な三角形に揃えるのは難しいので、各数値のかわりに2で割った余り (つまり奇数なら1、偶数なら0)を並べて、「2を法としたパスカルの三角形」 を作ってみましょう:

I:\www>jperl pascal02.pl
                                      1
                                     1 1
                                    1 0 1
                                   1 1 1 1
                                  1 0 0 0 1
                                 1 1 0 0 1 1
                                1 0 1 0 1 0 1
                               1 1 1 1 1 1 1 1
                              1 0 0 0 0 0 0 0 1
                             1 1 0 0 0 0 0 0 1 1
                            1 0 1 0 0 0 0 0 1 0 1
                           1 1 1 1 0 0 0 0 1 1 1 1
                          1 0 0 0 1 0 0 0 1 0 0 0 1
                         1 1 0 0 1 1 0 0 1 1 0 0 1 1
                        1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
                       1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
                      1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
                     1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
                    1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
                   1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
                  1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
                 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1
                1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1
               1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
              1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
             1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1
            1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1
           1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
          1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
         1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
        1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
       1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
     1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
   1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
  1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1

HTMLではセンタリングや色の使用が簡単なので、もっと容易に三角形の表示が可能です。 また画像を使うともっと大きいサイズのものでも見易い形で表示することができます。

































































いろいろ工夫してパスカルの三角形(またはそれから導いたもの) を自分のページに表示してみて下さい。 2ではなく3、4、5などで割った余りを考えるとどうなるでしょうか。 なお、自分の作ったPerlスクリプトもページ上で読めるようにしておいて下さい。