Skip to content

かんたんプログラミング #3 関数ってどんな数?

こんにちはalanです。

Wise9編集部のみんなは、サンフランシスコで楽しくゲームを作ってるみたいだけど、僕はいま北海道に居ます。

今回も面白いプログラミングの世界を学んでいきましょう!

ところでみなさんは「函館(はこだて)」という場所を知っていますか?

北海道の南に位置する、とても美しい街です。

この函館、不思議な名前だと思いませんか?

函館の由来には諸説あって、Wikipediaによるとこんな感じのようです。

地名の由来 [編集]

古来、この地はウスケシ宇須岸)と呼ばれていた。1454年享徳3年)、南部氏との戦いに破れた津軽の豪族・安東政季を擁し、武田信広らと共に蝦夷地に渡った河野政通が、函館山の麓(現在の弥生町付近)に築いた館(「宇須岸館」とも「河野館」とも呼ばれる)が箱に似ていたため箱館と呼ばれるようになり、明治時代になって函館と改められたとされるが、諸説ある。

フリー百科事典 Wikipediaより引用 http://ja.wikipedia.org/wiki/函館市

 

っまり「函館」の「函(はこ)」=「箱」ということですね。

さてさて、今回のかんたんプログラミングでは、この「箱」というか「函」について学んでみましょう。

みなさんは函数(かんすう)という言葉をしっていますか?

「関数なら知ってるけど函数なんてへんてこな数、知らないよ」と思うかもしれません。

確かに学校で習うのは「関数」です。

実は関数というのは現代になって作られた当て字で、本当は函数と書いていたのです。

 

「関数」と書かれると、「なにか関係する数」のように見えますが、「函数」と書かれると、「数に関係する函(はこ)」というイメージが湧いてきます。

これ、けっこうイメージ違いますよね?

 

関数というと、数に見えるのですが、函数というとどちらかというと函に見えるはずです。

ひっくりかえして数函(かずばこ)にすると、数が飛び出してくる箱、というイメージになりません?

 

そう。実は関数とは、ブラックボックス。つまりボタンを押すと数が飛び出してくる箱のことなのです。

 

ちなみにさらに面白いことに、関数は英語でfunction(ファンクション)と書きます。

そしてfunctionを英語の辞書でひくと、関数という意味以外にも意外な意味がでてきます。

function

音節func・tion 発音記号/fˈʌŋ(k)ʃən/音声を聞く音声を聞く

【名詞】【可算名詞】

1

機能働き作用目的of〕.

【数学】 関数.

 

というような意味があります。

日本語の漢字に複数の意味があるように、英語の単語にも複数の意味がある場合が多いのです。

function=函数(関数)と翻訳したのはまだ数学の概念が発達していなかった頃の日本人です。

だから安易に「関係する数」としても問題はなかったのでしょう。

しかしいま、コンピュータプログラミングの世界では、関数とは必ずしも数を意味しません。

コンピュータの関数が意味するのは「機能」や「働き」「作用」といったことです。

さて、前回の最後の問題はうまくできたでしょうか?

ループで渦巻き模様をつくるプログラムをさらにループさせる、というものでした。

どんな図形になりましたか?


function onLoad(){
    logo.init();
    penDown();
    for(j=0;j<4;j++){
        for(i=0;i<360;i++){
            move(10);
            turn(i); 
        }
        turn(90);
     }
    penUp();
}

shi3z編集チョが作ってくれたブラウザ上で実行するインタプリタ環境でも試すことができます。

http://junk.wise9.jp/js/
というか答えはもう出てますね。
さて、ループを二重の入れ子構造にすると、プログラムが少し複雑になってきました。

「渦巻きを描く」とか「円を描く」とかいう命令を出すときにいちいちループを書くのはちょっと面倒な気がしませんか?

そういうときに関数を作るのです。
関数を作る、というのはfunctionを作る。つまり機能を作る、ということで、このあたりが数学で用いられる関数とは根本的に違うところです。

では、さっそく渦巻きを描く関数を作って、さっきのループをシンプルにしてみましょう。


function uzumaki(){ //これが関数の定義
        for(i=0;i<360;i++){
            move(10);
            turn(i); 
        }
}

function onLoad(){
    logo.init();
    penDown();
    for(j=0;j<8;j++){
        uzumaki(); //←ここで関数を呼び出している
        turn(45);
     }
    penUp();
}

プログラムの世界で関数を作るのは難しいことではありません。

関数とはプログラムそのものを別の枠組みでくくる、ということです。

上のコードを実際に実行してみて下さい。

前回とはちょっと違った図形になるはずです。

上の「function」という定義部分で「uzumaki(うずまき)」という新しい関数を作っています。

それをループの中で呼び出しています。

関数の呼び出しには、関数の名前と、その後ろに括弧をつけることになっています。
コードの下半分と上半分を見比べてみて下さい。

これ、なにか気づきましたか?

そう。実は今まで書いていたプログラムは、そもそも「onLoad」という関数をしていたのです。

つまり関数を学ぶまでもなく既に書いていた、ということになります。

実はこの連載ではもうお馴染みのturnやmoveといった関数もまた、関数として別のファイルで定義されているのです。つまり関数をつくるというのは、命令を作るということであり、プログラミングとは自分で作った命令を自分で呼び出す、ということの連続になるのです。これがプログラミングが最高に面白いポイントでもあります。

いろんな関数を定義していくことで、自分だけの言葉、自分だけの命令によって世界を動かすことができます。プログラミングとは、自分だけの小宇宙をつくること、でもあるのです。

関数の面白さがちょっと解りましたか?

とはいえ、これだけではちょっとつまらないので、すこし関数を使っていたずらをしてみましょう。

function uzumaki(){
for(i=0;i<360;i++){
move(Math.random()*10);
turn(i);
}
}

関数は最初から様々なものが用意されています。
Math.randomという関数もそのひとつです。

これはMath(数学)というジャンルのrandomという関数ですよ、という意味です。

この連載であつかっているJavaScriptには無数の関数があり、総て覚えるのは大変ですし、実は私自身も覚えていません。

ですから本当に必要な部分だけを少しずつ切り出して紹介しています。また、いまどきは全部の関数を覚える必要は全くありません。たぶん総て暗記している人はあまりいないんじゃないかな。必要になったときにネットで「JavaScript 関数」とでも検索すれば、いつでも情報が手に入るんですから、覚える必要なんてあまりないんです。

さて、そのなかでもこのMath.randomは非常に面白い関数で、これは0から1までのランダムな小数(乱数といいます)を返す関数です。これに10を掛けると、ちょうど0から10までの好きな値になります。まるで酔っぱらいのようにふらふらとへんてこな線が出てきます。

ちなみに乱数を使うと、プログラムの実行結果は毎回変わります。だから、上のような写真にならなくても間違いではありません。

ゲームなどでときおり出てくる乱数の要素は、実はこのような関数を使って実現されているのですね。

 

Math.randomは数学ジャンルの関数だけあって、非常に数学の「関数」っぽいのですが、数学の授業に出てくる関数って、だいたいどうでもいい感じのものばっかりでしょ? f(x) = ax+bとか。それがなんの役に立つの?というものばかりです。

それに比べると、プログラムででてくる関数は最高にイカしてます。
だって、それは実際に役に立つ(機能する)からです。まさにfunctionという感じでね。

Math.randomを使ってuzumaki関数を書き直すと、関数というのがいかに便利で面白いものか、わかると思いますよ。ぜひ試してみて下さい。

Math.randomは、「0から1までの値を返す」 関数と説明しましたが、自分でつくる関数でも値を返すことができます。

また逆に数学の関数や、move、turnといった関数のようにパラメータを渡すこともできます。

試しにプログラムを以下のように書き換えてみましょう。


function random(x){
        return Math.random()*x;
}

function uzumaki(){
        for(i=0;i<360;i++){
            move(random(i));
            turn(i); 
        }
}

function onLoad(){
    logo.init();
    penDown();
    for(j=0;j<8;j++){
        uzumaki();
        turn(45);
     }
    penUp();
}

Math.randomは便利な関数なのですが、いかんせん名前が長過ぎるのと、あとから10を掛けたりするのは面倒です。そこでオリジナルの乱数を返す関数random(x)をつくってみました。

関数を定義するときに、パラメータ部分に変数を設定しておくと、それを関数のなかで使えるようになります。

そして値を返したい場合は、returnという命令のあとに、返す値を渡します。

この場合、Math.randomにxを掛けた値を返しているというわけですね。

uzumaki関数でrandomを呼び出すときにもちょっと細工がしてあります。

さきほどは「10」で固定だった部分をループ変数のiにしています。

こうするとどうなるか。

iは0から360まで増えていきますから、得られる乱数も0から360までの範囲で次第に増えていくことになります。つまり後半になればなるほど、大股で歩く酔っぱらい、のような動きになるのです。

ぜひ試してみて下さい。

また、以下のことも試してみることをお勧めします。

練習問題

1. moveにも乱数を渡してみよう
2. 円や正方形を描く関数を自分で作ってみよう

 

 

このエントリーをはてなブックマークに追加
はてなブックマーク - かんたんプログラミング #3 関数ってどんな数?
Post to Google Buzz
Share on GREE

Related posts:

  1. かんたんプログラミング #2:亀で学ぶ楽しいループの仕組み
  2. かんたんプログラミング #1:亀の子グラフィック

Comments Closed

One Trackback/Pingback

  1. assistant director of nursing salary on 金曜日, 3月 2, 2012 at 01:40

    assistant director of nursing salary

    wise9