作者: Bruce.
日時: 2009/2/11(01:06)
Bruce.です。

davi さんは書きました (2009/02/11 0:23):

>>> 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文の判定が真になったと
>> きと。
> 
> ほほぅ…本人が上手に使いこなせるのならば…という条件付きで、
> 無限ループを意図的に用いるってやり口もアリなんですね…。

そりゃもちろん。
上記のrepeat until ループはその内側のwhile ループの結果によって
ループを続行するかが決まりますから、

while ... begin
end;

のように前判定のループでも

repeat
until
のような後判定のループでもうまくいきません。
ちょっと変形すれば前判定のループでOKですけどね。
一回ムダに判定するような形になるので、それを嫌ったのかもしれません。


こんな感じ。

クイックソート
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html

  int partition(int[] a,int i,int j,int x){
    int l=i,r=j;

    // 検索が交差するまで繰り返します
    while(l<=r){

      // 軸要素以上のデータを探します
      while(l<=j && a[l]<x)  l++;

      // 軸要素未満のデータを探します
      while(r>=i && a[r]>=x) r--;

      if(l>r) break;
      int t=a[l];
      a[l]=a[r];
      a[r]=t;
      l++; r--;
    }
    return l;
  }



-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?
  mail kbk [at] kt.rim.or.jp
        web  www.kt.rim.or.jp/~kbk/zakkicho/
             homepage3.nifty.com/farstar/