Hoicos Blog

Author: かどけん

Scratchでフラクタル図形を描いてみよう!【前編】

再帰関数を使ってフラクタル図形を描く
4c85c234076325c638e2c305400f29d6 1024x1024 - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン

突然ですが皆さんは下の画像を知っていますか?

3e15e14696edccf4816a28f4aec80f27 - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン
画質ガビガビで申し訳ない……

これはシェルピンスキーのギャスケットと呼ばれるフラクタル図形の一つです!

といってもいきなり横文字ばっかりでわかりにくいですよね……一つ一つ説明していきます。フラクタル図形というのは図形の一部と全体が自己相似(再帰)になっている、つまり画像を拡大しても単純な形にならずに複雑さを保つ図形のことをいいます。(再帰という単語はプログラミングしていくときに非常に重要な要素になるので覚えておいてください。)シェルピンスキーのギャスケットはそんなフラクタル図形の中でも特に有名なもので、正三角形を組み合わせて作られています。ちょっと説明がわかりにくかったかもしれませんが大体そんな感じなのねと分かってもらえれば結構です。

Sierpinski zoom - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン
引用:File:Sierpinski zoom.gif – Wikimedia Commons

さて本記事ではシェルピンスキーのギャスケットをScratchで描くことを目標としています。前提としてScratchのブロック定義に関する基本的な知識が必要です。下に記事があるのでわからない方はそちらをまずご覧ください。

それではいってみましょう!

再帰ってなんだろう?

フラクタル図形を説明するときに再帰という言葉を使いました。あまり聞かない単語だと思うので一度定義を見てみましょう。

再帰(さいき)は、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。
引用:「再帰」(2021年3月2日 (火) 15:20 )『ウィキペディア日本語版』

Scratchで具体例を示すと

19fb702763ae58cf417d32f50bedee4b - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン
画像のブロックを実行するとブラウザもしくはScratchがクラッシュする可能性があるのでしないようにしてください。

ブロック定義の中に定義したブロックを入れ込むことを再帰もしくは自己参照といったりします。この”再帰関数”というブロックを実行すると定義の中に含まれる”再帰関数”が実行され、その”再帰関数”がさらに”再帰関数”を実行して……と無限に再帰関数が実行されます。扱い方は全く違いますがプログラムを繰り返すという点ではfor文やwhile文(ずっと~する、まで~するブロック)と似ていますね。

matryoshkas - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン

再帰関数を活用してみる

再帰について少しわかってもらえたでしょうか?この再帰をマスターするのは非常に難しいのですが使いこなせるととても複雑なことも簡単にプログラムすることができるようになります。皆さんも手を動かしながら再帰を使ったプログラムを作ってみましょう。

この記事は前編なので「1から入力された数字までの合計を表示する」プログラムを作ります。まずは自分の好きな名前の変数を作ります。ここでは合計を表すsumという名前をつけています。その後スプライトはいらないので消してもらって背景に以下のブロックを追加してみてください。

sum 1 1024x681 - Scratchでフラクタル図形を描いてみよう!【前編】-scratch-知識, Scratch, パソコン

以上です。一度実行してみましょう。試しに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が足されプログラムが終了するのです。

難しいですよね…

最後に

いかがでしたでしょうか?フラクタル図形を描くといいながら全く触れなくて申し訳ございません……ですが再帰関数という考え方は非常に重要です難しいと思いますができる限り理解していただけると後編のフラクタル図形を描くプログラムについてもすんなり理解していただけると思います。

ここまで読んでいただきありがとうございました!

この記事がいいと思ったら↓のシェアボタンから

Comments

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。