作者: Bruce.
日時: 2009/2/10(23:54)
Bruce.です。

davi さんは書きました:
> ちなみに岩波講座 言語の科学9 『言語情報処理』
> http://www.iwanami.co.jp/.BOOKS/00/2/006901+.html ← 表紙あります。
> (長尾真,黒橋禎夫,佐藤理史,池原悟,中野洋 2004/12)の
> pp.24-25にあるクイックソートのアルゴリズムは、以下の
> ように書かれていました。
> 
> −−−−−−−−−−−−−−−−−−−−−−−−−
> begin
>     quicksort(1,n);
> end
> 
> procedure quicksort(first,last);
> begin
>  x := data[(first+last)/2];
>  i := first;
>  j := last;
> repeat
>   while data[i] < x do i := i+1;
>   while x < data[j] do j := j-1;
>   if i ≧ j then goto 1;
>   swap(i,j);
>   i := i+1; j :=j-1;
>   until false;
>   1;
>   if first < i-1 then quicksort(first,i-1);
>   if j+1 < last then quicksort(j+1,last);
> end
> −−−−−−−−−−−−−−−−−−−−−−−−−
> 
> 最初の宣言で関数っぽくしているのが、高級言語っぽさを
> 出していますが、beginで書き始めるのがBASICっぽいです。
> 
> で、procedureとかrepeatとかswapとかの謎(?)の
> コマンド名(予約語?)が…。

procedure と repeat は予約語ですね。swapは本の別のところで登場している
ユーザー定義手続きでしょう。



> 「〜以上」は、「>=」とか「=>」とかではなく「≧」と
> 全角で書かれていました。

これは書籍に載せる(疑似)プログラムですから、見栄えの面でそうしたのでしょう。
TeXでも自動的にやってくれなかったっけ?

> 
> あと、個人的には until false;の直後の 1; が意味不明です。
> 何かのフラグ立てとして使っているんですか?

1;じゃなくて、1:じゃないですか?
#後ろがコロン
おそらくループから脱出するときのラベルです。

インデントがちょっとおかしいですが

> repeat
>   while data[i] < x do i := i+1;
>   while x < data[j] do j := j-1;
>   if i ≧ j then goto 1;←ループの終了
>   swap(i,j);
>   i := i+1; j :=j-1;
>   until false; ← repeat に対応
>   1;←gotoの指定先

repeat 〜 until ほげほげ
で、ほげほげが「真」になるまで繰り返しですが、上の例では until false なので
無限ループになっていて、抜けるときはswapの手前のif文の判定が真になったと
きと。

> でもでも、こういう、どこかに代入されるようには見えない
> ものを、いきなり1と宣言するってことは、この例文には、
> 何らかの暗黙のルールがあり、それが事前に説明されていない、
> ってことになりますよね?
> 
> # 確かに、「対象読者:こどもから大人まで」って書いてないけどさ…。
> 
> その下の2行文のif文も、その上にある2行文のwhile文で
> 吸収できそうな無駄な記述っぽい雰囲気が漂っているように
> 感じます。

それは大いに勘違いです。


-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html