- 締切済み
ヒープの探索の再帰 改め
前回の質問は↓ 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); とすることにより、探索が可能になりました。ただやはりもっと簡単にできそうな気がするのですが、思いつきません。もっと綺麗に書けるのならその書き方を教えて欲しいです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
もっとステップを縮小するということでしたら 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)
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)
アルゴリズム的にきれいにと言うことなら、さして問題にするところはなさそうですが、とりあえず if(A[i]>x)return 0; は1行まるまる不要です。 ソースの可視性的にきれいに書くなら、if文のあとのステートメントが1個でもちゃんと{}で囲ってインデントしてやるべきです。 例) if ( i > n ) { return 0 ; }