線形探索(番兵法)のプログラムについて考えています。
メイン関数からsearch関数に値を渡してそこで探索させるのですが、
int search(int a[], int n, int key)
{
int i = 0;
a[n] = key;
while (1) {
if (a[i] == key)
break;
i++;
}
return (i == n ? -1 : i);
}
のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。
色々な方法でプログラムを考えてみたいので。
そうすると、なんかうまくいきません。
for文だとどのように考えたらいいのでしょうか?
No.4ベストアンサー
- 回答日時:
番兵法の意義からすると冗長な表現を省いた#2の方法もそう悪くはないと思いますが、ソースの見やすさを考えると、私ならwhileを使って、
while(a[i]!=key) i++;
とします。
これは、
for(;a[i]!=key;i++);
と同義ですが、whileのほうが直感的に理解しやすいかと思います(慣れれば大して変わらないですが)。
多分動作速度もあまり変わらないでしょう。
#2ぐらいの変則的な使い方ならどうということは無いですが、中にはアルゴリズムを理解するのに「解読」が必要なほど難解な表現が使われることがあります(C/C++プログラマに多いような)。
そうしたほうがソースが短くて済んだり、動作が速かったりするのですが、あまり多用するとわけのわからない代物になります。
ここの#6さんの回答とかは面白いです。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=653025
初歩のforの使い方(規定回数ループさせるだけ)で番兵法は多分無理だと思います。
どうしてもループの継続条件と検索のためのif文で計2回の比較が入りますから、逐次検索と変わらなくなってしまいます。
多分ここでつまづかれていたんでしょうけど。
No.3
- 回答日時:
No1です。
>for(i=0;;i++)の終了条件は書かなくてもいいのでしょうか?
>こういう書き方をはじめてみました。
かまいません。No2のかたも言ってますが、
for(;;)とwhile(1)は同じ動作です。
forに関する説明文を注意深く読んでみて下さい。
話は変わりますが、今回の解の方法としては、
for(i=0;i<n;i++){
if (a[i]==key) return i;
}
return -1;
が最も素直な解でしょう。
No.2
- 回答日時:
もっと簡略化して
for(i=0;a[i]!=key;i++);
最後のセミコロンを忘れずに。
ちなみに、
while (1)
はそのまま、
for(;;)
と置き換えても、同じ動作をします。
継続条件を書かないのは、無限ループさせたいときによく使われる手法です。
http://www.kusa.ac.jp/~kajiura/c/kurikaeshi/newp …無限ループ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した数値を倍々するプログラム
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
プログレスバーで
-
ゲームオーバーのプログラム
-
IF文での条件の書き方について(...
-
go toに変わるもの
-
if文の中にfor文なのか、for文...
-
猫でもわかる、がわかりません。
-
プログラムで関数は使わない方...
-
新たな疑問 for( ; ; ){
-
n重のfor文にするには?
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
std::set<int> で、ある値が何...
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
【gcc・cygwin】multiple defin...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
入力した数値を倍々するプログラム
-
Cプログラムが終了しない
-
n重のfor文にするには?
-
UWSCにてある一定の動作を無限...
-
PIC のプログラムについて ど...
-
Excel VBAで年度をまたぐ期間の...
-
アルゴリズムです!四つの数字...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
ループの特定入力終了
-
For~Nextステートメントの終了...
おすすめ情報