さっそくだが、クイズだ。
Q.
厚さ1mmの紙がある。これを2つに折り曲げると2mmになる。もう一度折り曲げると4mm….
この作業を繰り返し行うと何回で月に届くであろうか?。なお月までの距離は384,400 kmである。

さて、どのくらいであろうか。
100回?1000回?10000回?

今回はこのクイズをpythonを使って解いてみよう。

今回は厚みを2倍にする処理を繰り返し行えばよさそうだ。
こういった時、pythonではwhile文を使う。

本題に取り掛かる前にwhile文の基本を学ぼう。

while 条件:
    #条件が正しいとき行う処理

具体的なソースコードにしてみる。

n=0
while n<10:
    print(n)
    n=n+1
print('終了')

[実行結果]

0
1
2
3
4
5
6
7
8
9
終了

一行目で変数nに0を代入している。
while文ではまず条件の判定を行う。
nは最初0なので
0<10
これは真となるので、字下げされた部分の処理を行う。
0と出力して、nに1を足している。
字下げされた部分が終わったら再び条件に戻って判定を行う。
nは1になっているので
1<10
また真なので処理を行う。
1と出力してnを1増やす
条件に戻って判定
2<10
出力、nを1増やす
以下同様に繰り返しnが9の時、条件は
9<10
となって真。
9と出力してnを1増やす
条件に戻って判定
10<10
これは正しくない,偽だ。
偽になったならwhile文を抜ける。
-----
条件を満たしている間、ループする感じを掴めただろうか?
ここで大事なのが処理の中の以下の部分だ。
n=n+1
これがないとnはずっと0のままで条件が偽になることがなくなってしまい「無限ループ」となってしまう。

問題にチャレンジ

OK。while文の基本がわかったのでさっそく月の問題にチャレンジしよう。
まず必要となる値を宣言しよう

dist=384400000000 # 月までの距離(mm)
thickness=1 # 紙の厚さ(mm)
count=0 # 折り曲げた回数

384400キロをmmに変換している。キロはメートルの1000倍、メートルはmmの1000倍なので0を6個増やせば良い。
紙の厚みを管理する変数thicknessを作って最初の厚み1mmを代入している
countは何回折り曲げたかを管理する変数だ。最初は0
ちなみにソースコードについている
# 紙の厚さ(mm)
はコメント文で、これはプログラムの実行に影響を与えない。今回みたいにメモ書きなどをしたい場合に使う。#記号の後ろはコメントとして扱われる。

while文

それではwhile文を作成しよう。紙の厚みが月の距離より短い間、繰り返し処理を行えばよさそうだ。
while thickness < dist:
あとはこの中に2倍する処理、カウントを増やす処理を入れればよい。
追記していこう。

dist=384400000000 # 月までの距離(mm)
thickness=1 # 紙の厚さ(mm)
count=0 # 折り曲げた回数

while thickness < dist:
    thickness=thickness*2 # 厚みを2倍にする
    count=count+1 # 回数を1増やす
    # 状況を出力
    print(count,'回折り曲げた','厚み:',thickness)

今回は途中の厚みも毎回表示するようにしてみた。

while文を抜けた時が月の距離を超えた時だ。
最後のその回数を出力しよう。

dist=384400000000 # 月までの距離(mm)
thickness=1 # 紙の厚さ(mm)
count=0 # 折り曲げた回数

while thickness < dist:
    thickness=thickness*2 # 厚みを2倍にする
    count=count+1 # 回数を1増やす
    # 状況を出力
    print(count,'回折り曲げた','厚み:',thickness)

# while文を抜けたら結果を出力
print(count,'回で月に到達しました。')

なんと39回で月に到達してしまった。このように倍々に増えていく事象は大爆発する。

バイバインの検証

倍々で思い出したが、ドラえもんの道具でものを5分ごとに倍にしていく「バイバイン」というのがある。
漫画の中ではのび太が栗まんじゅうにかけて処理しきれなくなり宇宙に送るという暴挙で終わるのだが,実際にどの程度増えるのかpythonで検証してみよう。

n=1 # 最初の個数
minute=0 # 経過時間
days=1 # 検証日数
day_minute=days*60*24 # 分に換算
while minute < day_minute:
    n*=2 # n=n*2と同意、個数を2倍にする
    minute+=5 # n=n+5と同意、5分進める
    print(minute,'分後',n) # 途中経過出力
print(n) # 結果出力

結果(1日)
497323236409786642155382248146820840100456150797347717440463976893159497012533375533056
たった1日でとんでもない数だ。

興味がある人はdaysの値を3とか10にしてみよう。
のび太のしてしまった暴挙の恐ろしさがわかる。