このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/659
#  [1] 授業単元:アルゴリズム 
#  [2] 問題文(含コード&リンク):  
#  以下を参考に再帰的二分探索を作成せよ。 
#  http://ime.nu/codepad.org/BHEasb4b 
#  お手数ですが、詳細はURLでお願いします。 
#  
#  [1] 授業単元:アルゴリズム
#  [2] 問題文(含コード&リンク): 
#  以下を参考に再帰的二分探索を作成せよ。
#  
#  int binsearch (int x, int v[], int n)
#  {
#  int p, q, m;
#  p = 0;
#  q = n ? 1;
#  while (p <= q) {
#  m = (p + q)/2;
#  if (x < v[m])
#  q = m ? 1;
#  else if (x > v[m])
#  p = m + 1;
#  else
#  return m;
#  }
#  return ?1;
#  
#  ?入力:int x, int v[], int n (binsearchに同じ)
#  ?出力:配列vにxが存在すれば、その場所(添字)。存在しなければ,‐1
#  ? プログラムの構造
#  ? ループを使用せず,関数の再帰呼び出しを使うこと
#  ? 外部変数で値の受け渡しをしないこと
#  
#  [3] 環境 
#   [3.1] OS:windows 7
#   [3.2] コンパイラ名とバージョン:gcc 
#   [3.3] 言語:c言語
#  [4] 期限:2011/10/15 23:00 
#  [5] その他の制限:配列は整数で昇順にソートされている前提でした。授業では配列、ポインタは習っています。よろしくお願いします。
#  

整列ならびの二分検索(_検索要素,_ならび,_前半ならび,_残りならび) :-
        ならびを二つ折りにする(_ならび,_前半ならび_1,_後半ならび_1),
        整列ならびの二分検索(_検索要素,_前半ならび_1,_後半ならび_1,_前半ならび,_残りならび).

整列ならびの二分検索(_検索要素,_前半ならび,[_検索要素|_残りならび],_前半ならび,_残りならび) :-
        !.
整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :-
        _検索要素 @< _要素,
        整列ならびの二分検索(_検索要素,_前半ならび_1,_前半ならび,_残りならび_2),
        append(_残りならび_2,_残りならび_1,_残りならび).
整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :-
        _検索要素 @> _要素,
        整列ならびの二分検索(_検索要素,_残りならび_1,_前半ならび_2,_残りならび),
        append(_前半ならび_1,_前半ならび_2,_前半ならび).

ならびを二つ折りにする(_ならび,_前半ならび,_後半ならび) :-
        length(_ならび,M),
        ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび).

ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :-
        0 is M mod 2,
        M1 is M // 2,
        length(_前半ならび,M1),
        length(_後半ならび,M1),
        append(_前半ならび,_後半ならび,_ならび).
ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :-
        1 is M mod 2,
        M1 is M // 2,
        M2 is M1 + 1,
        length(_前半ならび,M1),
        length(_後半ならび,M2),
        append(_前半ならび,_後半ならび,_ならび).