Listをやろう
1から10の和
Geogebraで関数型プログラミングにとりくむ
このワークシートはMath by Codeの一部です。
<プログラミングってなんだっけ?>
プログラミングといえば、
計算などの記号・数値の操作をして、
問題を解決したりするための計画書を作ることだね。
詳しい話は省きますが、
プログラミングには3つの側面がある
といわれているね。
さて、何でしょう?
順番にやる「順次」、
同じようなことをくり返す「反復」、
条件をつけて枝分かれする「分岐」。
やりたいことを1行1行書き並べえて、上から順に実行するのが順次だね。
for文やwhile文を使って条件をつけて同じようなことを繰り返すのが反復だ。
分岐は、変数の値の範囲などで、次にどうするかを変えるのが分岐だ。
また、
同じようなことを何回もかくのも無駄だから、変数と関数を用意して、記述を短くするのも便利だ。
プログラミングを建築としたら、堅牢で柔軟でエコなものが求められるだろう。
変数に対する手続きの流れを構造化するためにいろんな思想や言語やツールが次々に登場しているね。
現実の情報の流れにそってデータと処理の「型」を作り、それをデータとつなぐ「オブジェクト指向」。
関数を数学の定義に近づけようとする「宣言型、関数型」プログラミングの研究。
データ処理が表に対するものと考える行列・表・データベースの編集・探索のための「パッケージ」。
AI、機械学習の研究開発、組み込み、Web、バックエンド、モバイルなど用途別の「サービス」。
。。。などがある。
質問:あなたが関数型プログラミングについて知っていることや用語を伝えてください。
<手続き型 VS 宣言型>
200行5列の
200人の5科目(国、数、英、理、社)の得点表があるとしましょう。
これから200人分の平均点を出したい。
1人目の得点は
国+数+英+理+社で出して、第6列(C6)に記入し、第7列(C7)にも書こう。
そして、2人目も同じように第6列(C6)を書く。第7列(C7)には上の行の7列目(C7)+この行の6列目(C6)。
こんな感じでやると、7列目(C7)には、どんどん、6列目(C6)が足されていく。
そして、200行7列目(C7)には200人分の5科目合計点の合計が入る。
最後に201行目にC7÷200を計算して書く。
これが、「手続き型」だね。
juliaは手続き的にも関数型でも対応できるし、
添字が1スタートでgeogebraと同じだし、
記述がpythonに似ているので基本juliaで書いてみよう。
[IN]julia
0点から100点までの200行5列の表データdataを適当に作る。
#データ作成***************************************
data=rand(0:100,200,5)
#手続き的***************************************
C7 = 0
for hito in 1:200
C6 = 0
for kamoku in 1:5
C6 = C6 + data[hito, kamoku]
end
C7 = C7 + C6
end
C7/200
#***************************************
juliaは添え字が1開始で終了までの範囲をかくだけだから、初心者でも使いやすい。
しかし、他の言語はちがう。
範囲指定は繰り返しの書き方はC言語由来のスタート、増分、終了という書き方が
主流なので慣れが必要だ。しかも、今人気のpythonでさえも、添え字が0スタートだ。
「フローチャートのパラダイム・流儀」に慣れるのにはよいでしょう。
しかし、この程度の課題なら、エクセルとかの表アプリがあれば、そんな苦労は不要だ。
エクセルを使った人ならわかるだろうけど
6列目に=Σ(1行目の5列の範囲指定)という関数をかき、それを200行までコピーする。
2001行目6列目に=Ave(6列目の1行から200行の範囲指定)という関数を書けば、計算式も不要だ。
そして、7列目という加算の繰り返し結果の順次記入という手間がいらないね。
このように、順次や繰り返しというプログラミングのパラダイムを減らし、
数学的に(つまり、宣言的、内包的に)かけると、簡単だしわかりやすいね。
たとえば、6列目(L)は数データのリストになるね。
これを内包的にかいてみよう。
sum は、 hito番目のdataのすべての列のデータxの合計だ。
6列目(L)は、hitoが1から200番までいるときのsumの列だ。
あとは、平均=6列の合計÷6列の行数
=sum(L)÷size(L)のようにかける。
(※size関数はプログラミング言語によってちがうので注意しよう)
julia
#内包的***************************************
L= [ sum( [ x for x in data[hito, : ] ] ) for hito in 1:200 ]
sum(L)/length(L)
#***************************************
つまり、 と同じ書き方だ。
数学そのものの書き方だね。
ただ、2重のΣ計算の範囲をforのあとに記述しているだけだとわかるね。
では、geogebraで宣言型にかいてみよう
<ウォーミングアップ>
手続き型でも宣言型でも、for条件が入れ子になっていることがわかるね。
そこで、もっと簡単な1重のfor条件をgeogebraでやってみよう。
1から10までの和をjuliaでかく。
[IN]
#======================
lst=[n for n in 1:10]
sumlst=sum(lst)
#======================
[OUT]
55
ワークシートにgeogebraアプリを作成したかったら、
最下行の「+要素の追加ボタン」を押して作成を選びます。
次に適当にたとえば、図形や関数を選びましょう。メニューバーの右上の3本線「三」マークを押し、
プルダウンメニューから表示を選べます。その真中あたりの「表示」を押して
チェックボックスの「数式」にチェックを入れましょう。
そうすると、数式、geogebraコードが表示されます。
関数コマンドはgeobebraの日本語マニュアルページを辞書代わりに使ってみましょう。
geogebraではxは座標として解釈される予約語なので、変数は基本nなどにしよう。
1から10の和
さあ、この調子で2重のΣ計算を、geobebraを使って宣言型でかいてみよう。
200人分のデータの生成には、
data=Sequence(Sequence(RandomBetween(0,100),kamoku,1,5),hito,1,200)
200人分の5科目の合計点リストは、
L=Sequence(Sum(data(hito,k),k,1,5),hito,1,200)
平均点の計算は、
((Sum(L))/(Length(L)))