突然ですが皆さんは下の画像を知っていますか?
これはシェルピンスキーのギャスケットと呼ばれるフラクタル図形の一つです!
といってもいきなり横文字ばっかりでわかりにくいですよね……一つ一つ説明していきます。フラクタル図形というのは図形の一部と全体が自己相似(再帰)になっている、つまり画像を拡大しても単純な形にならずに複雑さを保つ図形のことをいいます。(再帰という単語はプログラミングしていくときに非常に重要な要素になるので覚えておいてください。)シェルピンスキーのギャスケットはそんなフラクタル図形の中でも特に有名なもので、正三角形を組み合わせて作られています。ちょっと説明がわかりにくかったかもしれませんが大体そんな感じなのねと分かってもらえれば結構です。
さて本記事ではシェルピンスキーのギャスケットをscratchで描くことを目標としています。前提としてScratchのブロック定義に関する基本的な知識が必要です。下に記事があるのでわからない方はそちらをまずご覧ください。
それではいってみましょう!
フラクタル図形を説明するときに再帰という言葉を使いました。あまり聞かない単語だと思うので一度定義を見てみましょう。
再帰(さいき)は、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。
引用:「再帰」(2021年3月2日 (火) 15:20 )『ウィキペディア日本語版』
Scratchで具体例を示すと
ブロック定義の中に定義したブロックを入れ込むことを再帰もしくは自己参照といったりします。この”再帰関数”というブロックを実行すると定義の中に含まれる”再帰関数”が実行され、その”再帰関数”がさらに”再帰関数”を実行して……と無限に再帰関数が実行されます。扱い方は全く違いますがプログラムを繰り返すという点ではfor文やwhile文(ずっと~する、まで~するブロック)と似ていますね。
再帰について少しわかってもらえたでしょうか?この再帰をマスターするのは非常に難しいのですが使いこなせるととても複雑なことも簡単にプログラムすることができるようになります。皆さんも手を動かしながら再帰を使ったプログラムを作ってみましょう。
この記事は前編なので「1から入力された数字までの合計を表示する」プログラムを作ります。まずは自分の好きな名前の変数を作ります。ここでは合計を表すsumという名前をつけています。その後スプライトはいらないので消してもらって背景に以下のブロックを追加してみてください。
以上です。一度実行してみましょう。試しに10を入力すると、画面に55と表示されました。1+2+3+4+5+6+7+8+9+10=55なので正しく動作しているようです。
なぜうまくいくのか引数が3のときのsumブロックの動きをみてみましょう。引数が3で0ではないのでsum(3-1)というブロック(関数)が実行されます。sum(3-1)はsum(2)であり引数が0ではないのでsum(2-1)が実行されます。sum(2-1)はsum(1)であり引数が0ではないのでsum(1-1)が実行されます。sum(1-1)はsum(0)であり引数が0なので変数”合計”に0が代入されます。その後sum(1)に戻り”合計”に1が足され、sum(2)に戻り”合計”に2が足され、sum(3)に戻り”合計”に3が足されプログラムが終了するのです。
難しいですよね…
いかがでしたでしょうか?フラクタル図形を描くといいながら全く触れなくて申し訳ございません……ですが再帰関数という考え方は非常に重要です難しいと思いますができる限り理解していただけると後編のフラクタル図形を描くプログラムについてもすんなり理解していただけると思います。
ここまで読んでいただきありがとうございました!
[…] Scratchで複雑な図形を描いてみよう!【前編】 […]