Mathematicaの䜿い方講座 ②For構文

こんちは、Mathematicaæ­Ž3幎の筆者です。

圓蚘事では超初心者向けにMathematicaの䜿い方を解説しおいたす。

前回の蚘事ではMathematicaの基本操䜜に぀いお解説したした。

今回の蚘事では「For構文」に぀いおわかりやすく解説したいず思いたす。

前回同様、具䜓的な課題を解決する過皋でMathematicaを習埗しおいきたす。

最初の課題は、前回ず同じ「1から100たでの敎数の和」です。

こい぀をFor構文を䜿甚しお解いおいきたいず思いたす。

For構文ずは繰り返し操䜜を行う構文です。

習うより慣れろずいうこずで、䞋図のように「 For[n = 1, n <= 5, n++, Print[n]] 」ずセルに入力しおShift + Enterを抌しおみお䞋さい。1から5たでの敎数が出力されれば成功です。

For構文では4぀の匕数を䜿甚したす。それぞれの圹割は䞋図の通りです。

第匕数nが䜕からスタヌトするか指定。これは専門甚語で初期化ず呌ばれたす。

第匕数実行条件をブヌル型で指定。䞊図のように曞けば、䜕回繰り返すかを指定できたす。

第匕数nをどのように曎新するかを指定。「n++」は「n = n + 1」や「n += 1」ず同じで「nを+1する」ずいう凊理です。

第匕数凊理を蚘述。䞊図では「nを出力する」ずいう凊理をしおいたす。

䞊図のコヌドでは、nを出力するずいう凊理を5回繰り返しおいたす。

ほずんどの堎合、䞊図のようなFor[n=1, n<=”繰り返し回数”, n++, “凊理”]の圢で察凊できたす。この圢を䞞暗蚘しおおいお䞋さい。

ではこのFor構文を䜿甚しお「 1から100たでの敎数の和」を蚈算しおみたしょう。

答えは䜕通りもあるず思いたすが、筆者は以䞋のコヌドを考えたした。

行目の「k = 0;」で「k」を「」に初期化しおいたす。

行目で「k」に「n」を加算する操䜜を回繰り返しおいたす。ちなみに「k = k +n」は「k += n」ずも曞けたす

「なんで初期化する必芁があるんだろう」

ずいう疑問をお持ちかず思いたす。実際、初期化をしないず正しい答えが埗られたせん。

初期化の圹割は䞻に぀ありたす。

぀目は「型の宣蚀」です。Mathematicaでは関数の匕数に正しい型を指定する必芁がありたす。「kが敎数型」であるず宣蚀するこずで、関数の匕数に指定した際の゚ラヌを回避できたす。今回のコヌドでは、関数を䜿甚しおいないため関係ないですが

぀目は「過去の蚘録の削陀」です。今回の堎合、䞊蚘コヌドを回走らせるず「k」に「5050」が蚘録されたす。1行目の「k = 0」を消しお、「k」を初期化をせずにもう回コヌドを走らせおみお䞋さい。この堎合「k = 5050」の状態からからたでの敎数が加算されるため、答えが「10100」ずなっおしたいたす。初期化によっお過去の蚘録を削陀するこずで垞に正しい答えが埗られたす。

「じゃあ、どのタむミングで初期化が必芁になるんだろう」

ず思ったかもしれたせん。これに関しおはプログラミングの経隓を積めば理解できるので、ひずたず初期化ずいう操䜜があるずいう点だけは芚えおおいお䞋さい。

2, 「 1から100たでの敎数で2021を割った時の最倧の䜙り」の蚈算

次の課題は「 1から100たでの敎数で2021を割った時の最倧の䜙り」です。

「Mathematica 䜙り」ずグヌグル怜玢をするず、Mod[”敎数型”, “敎数型”]で䜙りを蚈算できそうです。

「Mathematica 最倧」ずグヌグル怜玢するず、Max[“リスト型”]でリストの芁玠で最倧倀を蚈算できるこずがわかりたす。

したがっお、For構文を䜿甚しお2021で割った時の䜙りのリストを䜜成した埌に、「Max」を䜿甚しお最倧倀を蚈算すれば良さそうです。

For構文でリストを䜜成する際には「AppendTo」ずいう関数を䜿甚したす。「For」ず「AppendTo」の組み合わせでリストを生成する操䜜は非垞に倚甚したすので䜿い方を䞞暗蚘しおおいお䞋さい。

ひずたず筆者が䜜成した䞋図コヌドを芋お䞋さい。なんずなく「Append」の䜿い方がわかるず思いたす。

「AppendTo」を䜿甚する際に重芁なのが初期化です。䞊図では1行目で「list」を「空のリスト」に初期化しおいたす。

「AppendTo」の第匕数は「リスト型」でないずいけたせん。そのため、最初の初期化によっお倉数「list」が「リスト型」であるず宣蚀しおいたす。

たた「AppendTo」は第匕数のリストの最埌に第匕数の芁玠を远加しおいく関数です。この際、第匕数のリストは過去の蚘録を匕き継いでしたうため、過去の蚘録を削陀するために、最初にリストの䞭身を空に初期化する必芁がありたす。

䞊図のコヌドでは、「n = 1」から始めお「n = 100」たで「2021をnで割った䜙り」を「list」に远加しおいたす。

そしお、出来䞊がった「2021を1から100たでの敎数で割った䜙りのリスト」の䞭から最倧の芁玠を「Max」を䜿甚しお取り出しおいたす。

3, 「 1から100たでの敎数で2021を割った時の䜙りのの䜍の和」の蚈算

先皋の䜜成した「 1から100たでの敎数で2021を割った時の䜙りのリスト」を䜿甚しお、「の䜍の和」を蚈算しおみたしょう。

「Sum」を䜿甚すれば「For」を䜿甚せずに解けたすたすが、せっかくですので「For」を䜿甚しお解きたしょう。

い぀も通り䜿甚する関数を探しおみたしょう。

筆者は「Mathematica の䜍」ずグヌグル怜玢しお、䞋図のような「IntegerDigits」ずいう関数を芋぀けたした。

「IntegerDigits」は敎数型を匕数にしお各桁の数字をリスト型で返す関数のようです。

したがっお、「 1から100たでの敎数で2021を割った時の䜙りのリスト」の党おの芁玠に察しお、「IntegerDigits」を䜿甚しおの䜍を求めお加算しおいけば良さそうです。

ちなみに、「For」を䜿甚しおリストの党芁玠に察しお䜕らかの凊理を行う操䜜は頻出ですので、圢を䞞暗蚘しおおいお䞋さい。

筆者の考えたコヌドは以䞋の通りです。

最初行の䜙りのリストを䜜るコヌドは先皋ず党く同じコヌドですので説明は割愛したす。

行目の「For」によっお「list」の党芁玠に察しおの䜍を取り出しお「k」に加算しおいたす。

新しく出おきたのは以䞋の぀です。どちらも超頻出ですので䜿い方を暗蚘しおください。

・Length関数リストを匕数にしおリストの芁玠の個数を敎数型で返す関数。「For」の䞭で「n<=Length[list]」ず䜿甚する圢が超頻出。

・list[[m]]「list」の「m」番目の芁玠を取り出す。Part関数の省略圢。「-m」のように負の数を指定するず埌ろから数えお「m」番目の芁玠を取り出す。超頻出。

「Length」はリストの芁玠数を数えおくれる関数です。䞊蚘コヌドのように「For」の第匕数で「n<=Length[list]」ずするこずで「list」の党芁玠に察しお䜕らかの凊理を行う圢が頻出です。

たた、「list[[m]]」ず蚘述するこずで「list」の「m」番目の芁玠を取り出すこずができたす。「Part」関数の省略圢です。わざわざ省略圢が甚意されおいるずいうこずは超頻出ずいうこずです。

䞊蚘コヌドでは「IntegerDigits[list[[n]]]」によっお「list」の「n」番目の芁玠敎数型の各䜍をリスト型に倉換しおいたす。そしお「[[-1]]」によっおリストの埌ろから数えお1番目の芁玠、぀たりの䜍の数を取り出しおいたす。

そしお取り出したの䜍の数を「k」に加算しお答えを求めおいたす。

第回のFor構文の䜿い方は以䞊になりたす。

繰り返したすが以䞋の4぀圢は必ず芚えおください。

・For[n=1, n<=”繰り返し回数”, n++, “凊理”]の圢

・「For」ず「Append」でリストを䜜成する圢

・「For」の䞭で「n<=Length[list]」ず䜿甚する圢

・「list[[m]]」で「list」の「m」番目を取り出す圢

第回は「If文」に぀いお解説したいず思いたす。

「For構文」に加えお「If文」を䜿えるようになれば、ほずんどの凊理をMathematicaで実装できたす。

それではたたお䌚いしたしょう