• 締切済み

ヒープの探索の再帰 改め

前回の質問は↓ http://oshiete1.goo.ne.jp/kotaeru.php3?q=658496 です。 前回の質問は何とか自己解決できました。 int find(int x, int *A, int i, int n) { if(A[i] == x)return 1; if(i>n)return 0; if(A[i]>x)return 0; if(A[i]<x){ i = i*2 + 1; if(find(x, A, i, n))return 1; i++; if(find(x, A, i, n))return 1; } return 0; } そして関数呼び出しの際に、 find(x, A, 0, n); とすることにより、探索が可能になりました。ただやはりもっと簡単にできそうな気がするのですが、思いつきません。もっと綺麗に書けるのならその書き方を教えて欲しいです。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

もっとステップを縮小するということでしたら 1.if(A[i]<x){ このif文は不要です。こにきたときは、必ずA[i]<x になっています。 2.++; の後のif(find(x, A, i, n))return 1; の文は、return (find(x, A, i, n)); とかけます。そして、それ以降の文は削除出来ます。

  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.2

n が配列 A のサイズを意味するのなら、 if(i>n) の評価が if(A[i] == x) より先に無いとマズイのでは? 見た目でキレイとなると個人的趣味の領域になるので正解は無い ような気もします。 私の場合は return 文は極力1つだけにしたいのと、if 文の中で 直接関数を呼ぶ書き方を嫌うタチなので int find(int x, int *A, int i, int n) {   int nRet = 0;   int nStatus = 0;   if (i > n) {     nRet = 0;   }   else if (A[i] == x) {     nRet = 1;   }   else if (A[i] < x) {     i = i * 2 + 1;     nStatus = find(x, A, i, n);     if (nStatus) {       nRet = 1;     }     else {       i++;       nStatus = find(x, A, i, n);       if (nStatus) {         nRet = 1;       }     }   }   else {     nRet = 0;   }   return nRet; } ※この場ではインデントに全角空白を使用しています こうなるかな。(コンパイルチェック等はしていません) ここまで if else を連発するのもどうかと思いますが(苦笑) switch 文で書けたらキレイだろうなぁ… 尚、nRet = 0; としている部分は初期値が有るので厳密には不要 かも知れません。しかし有った方が全体像を掴みやすいと思います。 敢えて不要なコードを書く事も場合によっては必要かと。

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.1

アルゴリズム的にきれいにと言うことなら、さして問題にするところはなさそうですが、とりあえず  if(A[i]>x)return 0; は1行まるまる不要です。 ソースの可視性的にきれいに書くなら、if文のあとのステートメントが1個でもちゃんと{}で囲ってインデントしてやるべきです。 例)  if ( i > n ) {   return 0 ;  }

関連するQ&A