Loading [MathJax]/extensions/tex2jax.js

第九回 リストの応用『探索アルゴリズム』

プログラミング編

リストについての続き

マサト先生
マサト先生

やあ、こんにちは。今日はリストの続きについてやっていこう!

ヒロト
ヒロト

はい!よろしくお願いします。

マサト先生
マサト先生

今回はリストについて発展的な問題を取り扱おうと思う。心して取り組んでくれ。まずは手始めに『探索アルゴリズム』を作ってみよう!ここで、アルゴリズムとは、ざっくり言うと問題解決の手順を表現したものだ。探索アルゴリズムとは、多くのデータの中から目的のデータを見つけるためのアルゴリズムのことをいう。ネットで検索したことがあると思うが正にあれだ。

ヒロト
ヒロト

わー、今日は難しそうですね!でもワクワクします。

マサト先生
マサト先生

さて、まずはビットアローを起動してもらって『file19』を新しく作成してもらおう。そして、前回の復習になるのだが、ランダム関数を用いて1から10までの整数を20個ランダムに代入したリストを作ってほしい。

ヒロト
ヒロト

はい!ランダム関数は1行目に『import random』を書くのでしたね!よし、一発で決めてみせるぞ!

ヒロト
ヒロト

出来ました!少し考えたけど前回よりずっと早く書けました!

マサト先生
マサト先生

うむ、良さそうだな。では、そのようにランダムに作られたリストの中から『5』を探索してみよう。つまり、リストは実行するたびにランダムに作られることになるが、もしリストの要素の中に5が含まれていたら、その要素の番号を表示するプログラムを書いてみよう。これは難易度は低いので、ヒントなしでやってみて欲しい。

ヒロト
ヒロト

うーん、なるほど。これはfor文とif文をコラボさせたらいけそうな気がするぞ!

ヒロト
ヒロト

よし!出来ました!

8行目から下が新しく追加した部分です。まず、8行目でfor文の回数を20回にして、9行目のif文で順番に各要素が5に等しいかどうか調べています。もし等しければその要素の番号をprint関数で表示するようにしました。リストの番号は0番から始まるので、今回のリストでは左から13番目と15番目に5があることが分かりました。

マサト先生
マサト先生

うむ、素晴らしく完璧だぞ!では、キーボードから入力した数を探索するプログラムを書いてみよう。先ほどのプログラムに加筆・修正して書いてみよう!

ヒロト
ヒロト

キーボードからの入力ですね、確か『int(input())』を使ったと思うので

ヒロト
ヒロト

よし!これも出来ました!

8行目でtargetという変数にキーボードから入力した数を代入しました。今回は『i+1』と番号に1を足したので通常のように左から1番目、2番目・・・と数えられます。実行した結果、左から8番目と11番目に5があることが確認できます。

マサト先生
マサト先生

文句なしに完璧だ!

12行目のprint関数で i+1として『ずれ』を直しているところが工夫があっていいな!

よし、次の問題は、『さいころの出目集計プログラム』だ。つまり、さいころを100回振ったとき、各出目が何回出たかを集計するプログラムのことだ。ここで、新たに『file20』を作成してそれに書いていこう。

ヒロト
ヒロト

確率は \(\frac{1}{6}\) なので理論上はどの出目も約17回出るはずですね。

マサト先生
マサト先生

うむ、そうなるな。ここで新しい関数を紹介しよう。その名もカウント関数だ。カウント関数は指定した数がリストの中に何個あるかを教えてくれる関数だ。

書き方は『(リスト名).count(指定した数)』となるぞ。ちょっと練習として、先ほどのプログラムに加筆する形で書いてみよう。ただ、一つ大事な注意がある!count関数を使うときはサーバで実行』をしないとエラーが出てしまうのだ。画面上部に実行ボタンがあるからクリックすると『ブラウザで実行』か『サーバで実行』が選択できるからそこでサーバで実行を選ぶのだ。コントロールキーを押しながらF9ボタンを押しても同じ処理がされるからぜひ簡単な方を使ってほしい!

ヒロト
ヒロト

コントロールキーを押しながらF9ボタンですね!

print関数とカウント関数を合わせて使えば、1行追加するだけでいけそうですね!

マサト先生
マサト先生

1うむ、しっかり13行目にカウント関数が使われているな。

では、本題のさいころの出目集計プログラムを書いてみよう。file20を用意してそれに書いてみよう。

ヒロト
ヒロト

はい、まずさいころの出目をランダム関数で100回ゲットして、それをリストに入れてと・・・うん、そのあとカウント関数を使うのかな?では、ちょっと格闘してきます!

マサト先生
マサト先生

健闘を祈る!


比較的短い格闘の末・・・


ヒロト
ヒロト

ふう、意外とすんなりできたぞ!

まず、ランダムなさいころの出目100個を入れたリストを作るのは比較的すぐできました!1行目から6行目がそうです。まず空のリストAを用意して、for文を使って1から6の数を100個ランダムにAに入れました。そして、8行目から9行目で、1か6までの出目の個数をfor文を使ってカウントしています。for文のrange(1,7)は『1以上7未満』という意味だったことをすっかり忘れていました!

マサト先生
マサト先生

うむ、よくできているぞ!どの出目も約17回出るだろうという予想はちょっと微妙な結果になったな。それは回数が100回だったことに起因する。回数がもっともっと増えると理論値に近づくはずだ。その辺の研究は任せるぞ。ぜひ、いろいろな回数を代入して遊んでみて欲しい。なんたってコンピュータは文句ひとつ言わず実行してくれるからな!

ヒロト
ヒロト

はい!今回の問題でリストがとても応用が利くことがよく分かりました!いろいろ遊んでみたいと思います!

マサト先生
マサト先生

うむ、ぜひそうしてほしい。では今日はここまでにしよう。次回は図形をプログラムを用いて書くことを学ぶぞ!楽しみにしておいてくれ。では今日もお疲れさん。

ヒロト
ヒロト

はい!ありがとうございました!

コメント

タイトルとURLをコピーしました