コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

パスカルでパスカルの三角形をパスカりたかった

パスけてパスカルわからない

はい、おはようございます。僕です。巷で「小学校でプログラミングとか教えるようになったら何を使うの?」ネタが大喜利されていたので教育用プログラミングであるPascal使えばいいんじゃねーのって思ったのでパスカルと言われるプログラミング言語に手を出してみたところ見事にわけ分からなくなってしまいましたのでブログ記事にしてみました。なんだアイツ。末尾;どこに付けるのが正解なんだよ*1。意味わかんねーよバーーーカ。



Pascalをやることにした。

はい、そういったわけで、導入取り乱しましたが、はじめてのプログラミングなんて教育用プログラミング言語Pascalでいいだろってことで手を出してみることにします。というかすでに手を出してしまった。

件のパスカルはこんなやつです。

Pascalパスカル)は、ニクラウス・ヴィルトの設計(デザイン)によるコンピュータ・プログラミング言語である。ALGOL(直接的にはその一派生である、ヴィルトが関与したALGOL W)などの影響があるが、個人の設計であることに由来する簡素だがよく整った言語仕様(構文と意味)を持つ。用途の中に教育を意識しており、構造化された制御構造など、その当時「良きプログラミングの慣習」と考えられていたことの影響もある。一方で批判者からは、あくまでも教育用に過ぎない言語だ、といったような評もあることにはあったが、PascalコンパイラPascalで書ける(いわゆる言語処理系のブートストラップ)ことをはじめ、Pascalで書かれた#実用プログラム例は多くある。名前は、哲学者・数学者・科学者で、機械式計算機を製作するなど技術者でもあったブレーズ・パスカルにあやかったものである。

まあ、何言っているかわからないけども幸いなことにドットインストールに講座があります。

参考
Pascal入門


パスカルの三角形をつくろう

というわけで、なんとなく終えてしまったので練習にパスカルの三角形でもつくろうかと思います(パスカルだけに)。パスカルの三角形はこんなやつです。

パスカルの三角形(パスカルのさんかくけい、英語:Pascal's triangle)は、二項展開における係数を三角形状に並べたものである。ブレーズ・パスカル(1623年 - 1662年)の名前がついているが、実際にはパスカルより何世紀も前の数学者たちも研究していた。

文字だけ眺めてもよくわかりませんね。以下のような三角形です。

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

パスカルの三角形の特徴としては(x+y)^nの係数を並べたものとなります。その係数自体は_n C _rで計算できます。つまりこう。これで求められます。

 _0 C _0
 _1 C _0  _1 C _1
 _2 C _0  _2 C _1  _2 C _2

というわけで、組み合わせ計算さえ実装できればパスカルの三角形がつくれそうです。んで、つくった。

program pastri;

var
  tn, td, fcn1, fcn2, fcd: integer;

// 組み合わせ
function ncr(n,r:integer):integer;
begin
  fcn1 :=1;
  fcn2 := 1;
  
  fcd := 1;
  for tn:=1 to (n-r) do fcn1 := fcn1 * tn;
  for tn:=1 to r do fcn2 := fcn2 * tn;
  for td:=1 to n do fcd := fcd * td;
  if (r = 0) or (r = n) then
    ncr := 1
  else
    ncr := (fcd div fcn1) div fcn2;
end;

begin
  writeln(nCr(0,0));
  write(nCr(1,0));
  writeln(nCr(1,1));
  write(nCr(2,0));
  write(nCr(2,1));
  writeln(nCr(2,2));  
end.

実行結果はこう

1
11
121

どうして出力でプログラミングらしさのかけらもない処理を実装してしまうのか……、出力くらいループ回してだそうよ……。そして、組み合わせ処理も色々ゴリ押して作ってます。まあタイトルパスかりたかったって言ってるぐらいだし、僕のパスカル力なんてこんなものなのです。


あ、今思いついたけど組み合わせ計算も最大値比較してdivするようにすればやれば計算量減るなあ……。今こんな感じの計算しているけど  \frac {5!} {3!2!} 、この式はこうも書き換えられるわけで \frac{5×4}{2×1}……。まあ、いいや。僕のパスカル力なんてこんなものなのです。

動作はこちらで確認
compile pascal online



*1:C言語系統のプログラミング言語では、文の終わりを表し、Pascal系統のプログラミング言語では、文と文の区切りを表すそうです。