[python]アルゴリズム入門~FizzBuzz~

こんにちは!(^^)!

今回はアルゴリズムの続きとして、具体的なプログラムを作ってみましょう。

有名な問題に、FizzBuzzがあります。

FizzBuzz

問題

1から100までの数を順に出力するプログラムを作成しなさい。ただし、3の倍数の時は数の代わりに「Fizz」を、5の倍数の時は「Buzz」を、3と5の倍数の両方の倍数の場合には「FizzBuzz」を出力するものとする。

実際にプログラムを実行すると次のように出力されることを目指します。

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

では、ひとつずつ順を追って見ていきましょう。

1から100までの数を出力する

まずは単純に、1~100までの数を出力するコードを書いてみましょう。

フローチャートで表すと次のようになります。

これは、繰り返し処理を使って次のように実装することができます。

for i in range(1,101):
  print("Fizz",end=" ")

print()の第2引数にend=” “を入れることで、改行せずに空白をつけて出力することができます。また、range()の引数が1,101なのは、rangeは上限の数を含まないからでしたね。

3の倍数の時に「Fizz」を、5の倍数の時に「Buzz」を出力する

次に、3の倍数の時と5の倍数の時の条件をそれぞれ満たすプログラムを作成してみましょう。

フローチャートはどの様になるか、考えてみてください。

 

 

はい、このようになりますね。

3で割り切れるとき、5で割り切れるときの処理が視覚的に見えて分かりやすいと思います。

こうなればコードも書きやすくなるのではないでしょうか。

for i in range(1,101):
  if i % 3 == 0:
    print("Fizz",end=" ")
  elif i % 5 ==0:
    print("Buzz",end=" ")
  else:
    print(i,end=" ")

pythonの繰り返し処理と条件分岐を組み合わせて、1から100までの数字を3つのパターンに分類して処理することができました。

ここでは上から順に、①「3で割り切れるときは”Fizz”を出力」、②「①に当てはまらなくて5で割り切れるときは”Buzz”を出力」、③「②に当てはまらないときはiを出力」というプログラムになっているので、確認してみてください。

 

3と5の両方の倍数の場合に「FizzBuzz」を出力する

この問題で難しいのは、この最後の条件をどのようにプログラムに組み込むかということです。

1つの方法として、3の倍数の判定を行った後にそのままさらに5の倍数の判定を行う方法が考えられます。すると、次のような図になるでしょう。

iが3で割り切れるのかどうか判定した後に、割り切れた場合さらに5で割り切れるのかを判定し、Yesの場合は”FizzBuzz”を出力するという流れが表されています。その他の場合は一つ前のものと同じですね。

しかし、アルゴリズムを考える上で重要なのは、「いかに効率良く、わかりやすく課題を解決するか」ということです。一般的にいくつか条件分岐のある課題の場合、より特殊なケースから先に処理をしたほうが見やすいコードを書くことができます。そのため、次のようにフローチャートを書き換えてみましょう。

どうでしょうか。先ほどのものよりいくらかすっきりしましたね。またここでは、「3と5の両方で割り切れる」という条件は「15で割り切れる」という条件と同義であるため、このように簡略化しました。

では最後に、このフローチャートに基づいてコードを書いてみましょう。

for i in range(1,101):
  if i % 15 == 0:
    print("FizzBuzz",end=" ")
  elif i % 3 == 0:
    print("Fizz",end=" ")
  elif i % 5 == 0:
    print("Buzz",end=" ")
  else:
    print(i,end=" ")

これを出力すると、最初に示した通り、次のようになります。

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

最後に

いかがでしたか?

今回のように、一度に全部のプログラムを作ってしまうのではなくて、簡単なプログラムから順に作っていくほうがわかりやすい場合もあります。どのようにしたら効率よく、わかりやすいプログラムを作ることができるのか考えながら、これから問題を解いていきましょう!

ではまた(^^)/

コメントを残す

メールアドレスが公開されることはありません。