次のwhile文の簡単な例を見てみましょう。
•ファイル名:while1.py
1 a = 1
2 w h i l e a < 1 0 : # aが1 0未 満 な ら 以 下 を 続 け る
3 p r i n t a * a , # aの 二 乗 を プ リ ン ト す る
4 a = a +1 # aの 値 を 一 つ 増 や す
5
6 p r i n t ’ o w a r i ’ # w h i l e文 を 抜 け て か ら こ の 処 理 を 行 う
実行結果の例 1 4 9 16 25 36 49 64 81 owari
ここで,上の説明での条件Aに相当するものは『a<10』で,処理Xは『print a*a; a = a+1,』です。
while1.pyでは次のような処理を行っています:
1. 変数aを1にセットする。
2. a<10か調べる。a=1だからは条件a<10は真なので 3. a*a=1をプリントする。aの値を1増やす(a=2になる) 4. a<10を調べる。条件a<10は真なので
5. a*a=4をプリントする。aの値を1増やす(a=3になる) 6. ...
7. a*a=9をプリントする。aの値を1増やす(a=10になる)
8. a<10を調べる。条件a<10は偽なのでwhile文の処理は終わる。
9. owariと表示する。
上の処理のように,while文の中にカウンター(一つずつ増える変数)と停止条件を書くことで,for文と同 じ処理を行うことができます。次のfor文は上のプログラムwhile1.pyと同じ出力になります。
1 for a in r a n g e(1 ,10):
2 p r i n t a * a 3
4 p r i n t ’ o w a r i ’
17.2 while 文の例
17.2.1 3n+ 1問題の数列の生成
while文を用いて前の節の問題(nが偶数なら半分にし,奇数なら3n+ 1に変えることを繰り返してでき
る数列を作る問題)を書き直してみましょう:
•ファイル名:while2.py
1 a = i n p u t(’ I n p u t an i n t e g e r : ’) # 数 を 入 力 さ せ て , そ の 数 を aに 入 れ る
2 p r i n t a , # aの 値 を プ リ ン ト
3
4 w h i l e a != 1: # a≠1で あ る 限 り 以 下 の 処 理 を 繰 り 返 し 行 う
5 if a %2 == 0: # aが 偶 数 な ら
6 a = a /2
7 el s e: # aが 偶 数 で な い な ら
8 a = 3* a +1
9 p r i n t a ,
実行結果の例 Input an integer: 19
19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
前回の課題と同じ結果が得られました。もっと大きな数ではどうなるでしょうか?例えばa=6171から始める と261回の繰り返しの末に最終的にa= 1となります。
実行結果の例 Input an integer: 6171
6171 18514 9257 27772 13886 6943 20830 10415 31246 15623 46870 23435 70306 35153 105460 ...
... 略 ...
...
1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
17.2.2 繰り返しが終わらないプログラム
次にwhile文を使って永遠に終わらないプログラムを作ってみましょう:
•ファイル名:while3.py
1 # * c o d i n g : utf 8 * -2 j =1
3 w h i l e Tr u e: # 条 件 は 永 遠 に 真 な の で , 以 下 を ず っ と 繰 り 返 す !
4 p r i n t ’ひつじが’+str( j )+’匹’
5 j = j +1
実行結果の例 ひつじが1匹
ひつじが2匹 ひつじが3匹
...
...
このwhile文では条件がいつでも真(True)なので繰り返し処理が永遠に続きます。
プログラムを終了するにはCTRL + Cと入力します。
17.2.3 while文の中でbreak, else, continueを使った例
while文の繰り返しはbreakを書くことによって止めることができます:
•ファイル名:while4.py
1 # * c o d i n g : utf 8 * -2 j =1
3 w h i l e Tr u e:
4 p r i n t ’ひつじが’+str( j )+’匹’
5 j = j +1
6 if j > 1 2 3 4 5 6 : # も し 羊 の 数 の 二 乗 が1 2 3 4 5 6を 超 え た らw h i l e文 を 終 え る
7 b r e a k
8
9 p r i n t " Too m u c h s h e e p s ! I ’ m a l r e a d y a s l e e p ... zzz "
実行結果の例 ひつじが1匹
ひつじが2匹 ひつじが3匹 ...
...ひつじが123456匹
Too much sheeps! I’m already asleep...zzz.
while文でもelseを使うことができます。while文の条件がFalseになったときだけに行う処理を書き
ます。while直後の条件が成立しなければelse以下を処理します:
17.2 while文の例 17 WHILE文による繰り返し
•ファイル名:while else.py
1 a =0
2 w h i l e a <5:
3 a = a +1
4 p r i n t a , 5 e l s e:
6 p r i n t ’ h o g e h o g e ’ 7
8 p r i n t ’ END ’
実行結果の例 1 2 3 4 5 hogehoge END
上のプログラムは意味のないプログラムですが,後で紹介するようにbreakをwhile-else文の中で使うと 効果的なプログラムを作ることができます。
次にwhile文の中でcontinueを使った文を作ります。その前に,ある文字列の中に特定の文字(列)が
入っているかどうかを確認する方法を紹介します。次は文字列Shinshuの中にnsをいう文字が入っている かを調べています。
1 > > > ’ ns ’ in ’ Shinshu ’
2 T r u e
3 > > > ’ sn ’ in ’ Shinshu ’
4 F a l s e
さて,羊を数えたいのですが,数字の4は不吉に感じるので,匹数に4を含むものは飛ばしながら最大20匹 まで数えることにしましょう。
•ファイル名:while continue.py
1 # * c o d i n g : utf 8 * -2 a =0
3 w h i l e a < 2 0 :
4 a = a +1
5 if ’ 4 ’ in str( a ): # も し aの 中 に 数 字4が 含 ま れ て い た ら
6 c o n t i n u e # 次 のp r i n tを 行 わ ず にw h i l eの 条 件 確 認 に 戻 る
7 el s e: # そ う で な け れ ば
8 p r i n t ’羊が’+str( a )+’匹’ # 羊 を 数 え る 9
10 p r i n t ’ zzz ... ’
実行結果の例 羊が1匹
羊が2匹 羊が3匹 羊が5匹 羊が6匹 羊が7匹 羊が8匹 羊が9匹 羊が10匹 羊が11匹 羊が12匹 羊が13匹 羊が15匹 羊が16匹 羊が17匹 羊が18匹 羊が19匹 羊が20匹 zzz...
実は上のような処理はfor文を用いたほうが簡潔に書けます:
1 # * c o d i n g : utf 8 * -2 for i in r a n g e(1 ,21):
3 if not ’ 4 ’ in str( i ): # も し iの 中 に 数 字4が 含 ま れ て い な い の な ら
4 p r i n t ’羊が’+str( i )+’匹’ 5
6 p r i n t ’ zzz ... ’
17.2.4 フィボナッチ数列の生成
フィボナッチ数列1,1,2,3,5,8,13,21,34,· · ·,つまり漸化式
a1= 1, a2= 1, an+1=an+an−1, n= 2,3,4,· · · (1) で定義される数列を表示するプログラムを作ってみましょう。ただし,数列の値が100000000を超えたら停 止するものとします。この場合でも,どのnに対してanが100000000を超えるか分からないのでwhile文 を使うのが便利です。プログラムは次のアルゴリズムに従って書くことにしましょう:
1. maxvalue = 100000000とおく。
2. a=1とおく。b=1とおく。
3. while文でa<maxvalueが成り立っている間は,次の処理4-5を繰り返す。
4. aの値をプリントする。
5. a,bの値をそれぞれb,a+bに置き換える。
6. a<maxvalueが偽になってwhile文を抜けたら,次の数列の値をプリントする。
•ファイル名:while5.py
1 m a x v a l u e = 1 0 0 0 0 0 0 0 0 # m a x v a l u eを 右 辺 の 数 字 に セ ッ ト す る
2 a = 1 # a = 1 と お く
3 b = 1 # b = 1 と お く
4 w h i l e a < m a x v a l u e :
5 p r i n t a # こ こ が
6 a , b = b , a + b # 繰 り 返 さ れ る ブ ロ ッ ク
7
8 p r i n t ’ The n e x t v a l u e is ’, a # the ne x t v a l u e i sとaの 値 を プ リ ン ト す る 実行結果の例 1
1 2 3 5 ...
63245986
The next value is 102334155
17.2.5 素数判定プログラム
次に与えられた自然数(≥2)が素数かどうか判定するプログラムを作ってみましょう。与えられた数nを2 から順に√
n以下のすべての自然数で割ってみて,どれかの数で割り切れたらnは合成数,そうでなければn は素数です。そこで次の手順で判定する事にします:
1. 数nの値を入力させる(ただしn≥2とする)。 2. i= 2とする。
18 練習問題
3. i2≤nである間は,次の手順4-5を繰り返す。
4. もし,nでiで割り切れたら「nは素数ではありません」とプリントして3の繰り返しを終了する。
5. そうでなければiをi+ 1にする。
6. もし3の条件全てが偽であったら,「nは素数です」とプリントする。
•ファイル名:while primeQ.py
1 # * c o d i n g : utf 8 *
-2 n = i n p u t(’ I n p u t an i n t e g e r ( >1): ’) # 数 を 入 力 さ せ て , そ の 数 を 変 数nに 入 れ る
3 i = 2 # i = 2 と お く
4 w h i l e i * i <= n : # i * i≦nな ら 以 下 を 繰 り 返 す
5 if n % i == 0: # も し nがiで 割 り 切 れ た ら
6 p r i n t n , ’ is not a p r i m e . ’ # nは 素 数 で は な い と プ リ ン ト
7 b r e a k # w h i l e文 抜 け て1 2行 目 以 下 へ 進 む
8 e l s e:
9 i += 1 # iの 値 を 一 つ 増 や す
10 e l s e: # i * i > n と な っ た ら
11 p r i n t n , ’ is p r i m e . ’ # nは 素 数 で あ る 12
13 p r i n t ’おわり’
実行結果の例 Input an integer: 1237
1237 は素数です。
おわり
実は上のプログラムではn= 1が素数と判定されてしまいます。
18 練習問題
18.1 問題:素数判定プログラム
上のプログラム(while primeQ.py)を修正し,n= 1が素数でないと判定されるようなプログラムを作り なさい。