みんなでプログラミングteaching site|学習ツール指導マニュアル|Python入門
みんなでプログラミング
0

Learning Tool Teaching Manual 学習ツール指導マニュアル

Python入門

学年
高校生
  • 1
  • 2
  • 3

①基礎(出力・変数・入力)

概要

Pythonで出来ることを体験する。最も初歩的な「命令内に直接書かれた文字や数字を画面に表示する」、「文字や数字をあらかじめ入れておいた場所から取り出して画面に表示する」、「プログラム実行中に利用者がキーボードから入力した値をプログラム内で指定した文字とともに表示する」ということを行う。
画面に表示(出力)する「print」と、入れ物として使う「変数」というもの、キーボードから「入力」させる「input」を書き方とともに学習する。

指導のポイント

いきなり「関数」と表記されているが、生徒にはまず「コンピュータに指示を出す命令」という理解で使わせたい。融通の利かないコンピュータ(プログラミング言語)に対して、「ルールに沿って決まった命令の与え方がある」ことを周知する段階である。
別のプログラミング言語に触れていれば、考え方を理解するのもたやすいが、入力→変数→出力というプログラムによるデータの流れを理解するには初心者には難しい。できれば、機器の基本的なデータの流れとして五大装置などの学習をしていると、ここの学習も進めやすい。
まず、紙に印刷するのも画面に表示するのもコンピュータが実行した結果を「出力」するものであるというイメージを持たせること。
本来、文字列と数値は明確に区別されるのだが、詳しい説明は次のステップで行う。

プログラミングのポイント

変数はいろいろなデータを格納できる器で、プログラム内で中身を消したり入れ替えたりすることができるから「変わる値」であることを知る。逆に何もしなければ値は変化しない。この段階では変数の内容を途中で変更したりしないので、最初に格納した値をそのまま表示している。もし途中で変数を更新すれば、同じ変数を表示させるプログラムでも、場所によって異なるものを出すこともできるようになる。なお、利用に当たっては、変数を命名するルール(使ってはいけない単語など)を覚える必要がある。
「print内に直接指定して表示する」、「変数内に値を入れておいてprintは変数を指定して表示する」、「inputで入力させた値を変数に入れてprintは変数を指定して表示する」の3パターンの違いを確認すること。
キーボードから入力した文字や数字をプログラム内で使うのが「input」である。入力された値は必ず変数に格納してから使うので、変数の知識は必須となる。何を入力させたいのかガイダンスを行う文字列を同時に指定するやり方はprintと同じなので、ついつい変数指定を忘れがちである。
最後には入力させた物をそのまま画面に表示するのではなく、print内で出力したい内容を合体させられることを同時に学習している。ここでは、文字列の足し算と覚えておけばよいだろう。人間が見やすいというだけでなく、プログラミング的な誤りを防ぐためにも、printの括弧内の空白は重視しておくべきである。

学年
高校生
  • 1
  • 2
  • 3

②データ型

概要

前のステップで「変数」を知り、データとして文字と数字を扱うことを覚えたが、文字も数字も区別無く入力させたり、変数に格納したり、出力したりを行っていた。実は多くのプログラミング言語では扱うデータの種類を明確に分け、線引きしている。
Pythonでも数字は整数、実数(浮動小数点)の2種類、そして文字とは明確に区別される。
この考えで分けたデータの種類をデータ型といい、変数に値を格納した瞬間にデータ型が判定されて、以降そのデータ型として固定されて扱われることを知る。

指導のポイント

生徒からの「なぜデータ型は分かれているのか」という問いには、歴史的な経緯で説明できる。昔はコンピュータの持つ少ない資源(ディスクやメモリなど)を効果的に活用するには、無駄に変数の器を大きくするわけにはいかなかった。そのため、整数型でもサイズの指定が必要なプログラミング言語もある。また、変数を利用するには、あらかじめプログラムの冒頭でデータ型とともに宣言をしてからでないと扱えないものもある。Pythonは宣言せずに、いきなり変数を指定して値を代入できる特徴がある。Pythonは非常に簡易に変数を扱える反面、データ型の違いを忘れてエラーを出してしまうことが多い。何に使うために何の値を入れておく必要があるのかをしっかり考え、変数を使っていきたい。

プログラミングのポイント

小数点のありなし、変数に値を格納する時に、引用符のありなしでデータ型が決まることを確認する。また、float()やint()でくくってから変数に代入すれば、小数点の形式で無くても実数として代入できたり、その逆もできたり、数値なのに文字列として代入できたりすることも学ぶ。
また、キーボードからinputで入力させた値は“すべて文字列として変数に格納される”ということは、絶対に意識すべき事項である。結果をそのまま表示させるだけなら問題とならないが、数値のつもりで計算に使うとエラーになる。たいした説明も無く「type()」が使われているが、基本的にはデータ型の判定しかしないので、長大なプログラムや複数人で別々に開発している時などのチェックでは有用なものだ。
print内で「+」を使って合体できるデータは文字列に限られるため、数値を文字列に変換している。

学年
高校生
  • 1
  • 2
  • 3

③計算

概要

すべてのプログラミング言語には計算の機能が備わっていて、その書き方の基本部分は大きくは変わらない。最も基本的な計算式の使い方のみ学習する。Python特有の書き方も存在するが、ここでは対象外である。
前ステップまでに学習したprintやinput、データ型の知識を使って一般的な計算式の書き方を学習する。

指導のポイント

四則計算のうち、+-はキーボード上に直接刻印があるが、×や÷は存在しない。そこで、×の代わりに「*」、÷の代わりに「/」を使うことを知る。計算の優先順位も算数・数学と同一である。優先させたければ括弧でくくる必要がある。ただし、大括弧・中括弧・小括弧のような区別は無く、単に対応する()を使っていくため、今後複数の括弧を使い分けるときに、優先範囲に注意する。
また、inputやprintの範囲を表す括弧とfloatの範囲を表す括弧、計算式の括弧などもすべて同じ括弧なので、迷うときにはドラッグで反転表示させて範囲を確認するなど、実行前に確認が必要である。

プログラミングのポイント

四則計算に使われる記号のことは演算子と呼ばれるので、この言葉は覚えておく必要がある。
除算(割り算)を行う場合は端数が出る(小数点になる)可能性が高いため、データ型は実数(浮動小数点)型にしておく必要がある。一般的な紙の上での四則計算で使わない剰余(割り算をしたときの余り)を求める演算子「%」は、プログラミングにおける基本なので、どのような結果になるのか様々な数値で試しておきたい。具体的には「5 制御構造1(if)」で活用する。
だいたいの使い方を把握したところで台形の面積を求めるが、もちろん公式が分からないと式を立てることができない。逆に言えば未知の公式であっても、「何を求める公式であるか」、「計算にあたって何の値が必要となるか」だけがわかればプログラムは書けてしまうことになる(台形は上底と下底と高さの3つがわかればよい)。つまり難しい計算が求められる場面でも、解説された本を元にプログラムに置き換えていく作業は、それほど難しくない。

学年
高校生
  • 1
  • 2
  • 3

④配列(リスト)

概要

イメージとしては、変数内に場所を区切って複数のデータを格納する機能が配列(リスト)である。
書式に従って代入しておけば、一括で全データを取り出すことも、特定のデータを指定して取り出すことも可能である。
数値をリスト化しておけば、取り出して計算に使うこともできる。また、事前に作ったリストにあとからデータを追加することも可能だ。
関連するデータを別々の変数に入れると扱いが大変なので、一定のルールで1つのリストに格納しておくと、使い勝手が良くなる。

指導のポイント

リスト内に格納するデータは数値と文字列を混在することも可能だが、利用するときに一手間増えるのでここでは扱わない。リスト内に文字列を記述するときには、引用符だらけになり、数が合わなくなるミスが発生する。必ずデータ間に空白を入れて、見間違えないような工夫をしよう。数値を並べるときも、カンマとピリオドを間違えると異なる値とデータ数として格納されてしまうので、注意が必要である。
リスト内からデータを取り出すときには連番で指定するわけだが「ゼロから番号が開始すること」、「番号は[]でくくって指定する」の2点は必ず抑えておきたい。最初のデータを1としてしまうと、すべてずれてしまう、また、他のプログラミング言語では[ ]ではなく()を使うことがあるので気をつけたい。

プログラミングのポイント

ここでは問題とならないが、漢字のような全角文字を入力するときに、引用符や区切り記号を全角で入力するミスが起こる。また、データがゼロから始まることを忘れて全部で5個あるから5番目のデータを取り出そうと[5]としてしまうとエラーになる。今回は整数値をリストに入れているが、実数だと「.」が加わるので、さらに記述に慎重さが求められる。
「.append()」という命令(正確にはメソッドいう)を使ってデータを追加しているが、追加したデータはどこに入るのかプログラムで確認しておきたい。
二次元リストはある程度規模の大きいプログラムでしか使わないが、表計算ソフトを使ったことがあるなら難しくない。表計算ソフトのABCが横に並ぶ列が「column:カラム」であり、123が下に連番で並ぶ行が「row:ロウ」である。日本語では「行列」と言うが、基本的に指定は列・行の順序で行うのが一般的である。朝礼でA組B組の出席番号順で並んでいる状態を思い浮かべて、当てはめてみよう。
また、「6 制御構造2(for)」で活用するが、範囲を表すrange()とリストを操作する(ここでは作成に使っているlist()の使い方も覚えておこう。

学年
高校生
  • 1
  • 2
  • 3

⑤制御構造1(if)

概要

基本制御の1つである「条件分岐」を学習するところである。何らかの条件や例外が発生したときに、それ以降に行わせる処理を分けることができる。
いままでは、入力や表示などがプログラム内に書かれた順序通りにそのまま実行されてきた。これを条件によって処理の流れを分けるのが「if」の役割である。「したいこと」をプログラムに置き換えていくときに、絶対に外せない機能の1つだ。

指導のポイント

最も多いトラブルは記述ミスである。ifを記述するには書式を守ること(ifの行末には「:(コロン)」が入るなど)。インデントをしていない行はifの制御下から外れてしまうこと。行が隣接していようが離れていようが、インデントのあるなしですべて決まる。
また、条件分岐を行った後で、分かれた処理がまた再び1つの流れに乗る場合がある。どちらの分岐であっても必ず「事前に共通で行うべき処理」と「事後に共通で行うべき処理」を分け、二重に処理を行わないような注意が必要である。なぜ分岐するのか、分岐後それぞれで何をしたいのか、最終的にどのような処理をさせたいのか。どこからどこまでをifの制御下に置くのかをフローチャート等を作る段階でよく考えよう。複数分岐のように処理の流れが2つではなく、3つ以上になる場合には特に注意しよう。

プログラミングのポイント

“条件”を書くには比較演算子が理解できていなければならない。また、計算式を書くこともできるため、計算の法則もつかんでいる必要がある(%の処理結果など)。変数を2で割った余りを求める式が変数%2であり、余りが無ければ0、そうでなければ1を返してくる記述である。ただ、1行目で小数点を入力される可能性があるため、0か1以外の値になることもあり、それは実数(浮動小数点)であると断定できる。そのため、それ以外の処理をすべてまかせるelseで対処している。elifが複数条件の2番目以降に利用する記述であったのに対し、elseはifの条件に一致しないその他全てが実行される分岐の流れである。
2つ目のプログラムでは、ifの中にifが入り込むような多重構造「入れ子」を利用している。入れ子は分岐した流れ内での再分岐であるため、流れをきちんと分けていないと思わぬ結果となるので注意したい。大きな二分岐の方がきちんと動作していないと、入れ子は実現できないので、うまくいかない場合は最初は10行目以降をコメントにしておくとよい。正解、不正解がきちんと判定できてから、入れ子のifに挑戦しよう。
ifの条件は比較演算子による大小や一致・不一致(>,>=,<,<=,==,!=)以外に、論理演算(and、or、not)が使用できる。ここでは1988以上かつ1994以下というandを使って条件を作成している。

学年
高校生
  • 1
  • 2
  • 3

⑥制御構造2(for)

概要

基本制御の1つである「繰り返し(ループ)」を学習するところである。コンピュータに処理させる最も意味ある部分で、正確な処理を何十回でも何万回でも自動で繰り返させることができる。
for の記述と同時に変数を宣言し、回数や繰り返しの範囲を指定して、その増減数を変数内に格納することができる。変数は繰り返し回数に伴い変化するので、応用範囲は広い。

指導のポイント

forも書式がしっかりと定められているので、ルールを守って記述しないとエラーになる。ifと同様にインデントによってforの制御下に入るかどうかが決まる。
大きな全体的な繰り返しの中で、個別な小さな繰り返しが内包される入れ子を書くこともある。ifのように処理を分岐させるわけではないので、それぞれのfor は独立して記述されるので注意したい。ifの中にfor やfor の中にif も記述できるので、どこまでが処理のかたまり(ブロック)なのかを把握していないと失敗する。
また、forで使うことを指定した変数は、配列の添え字(インデックス)にも使えるので、配列内の値を取り出したり格納したりするような用途では定番として使われる。

プログラミングのポイント

range()は繰返し回数を数値で指定する方法である。forで使うことを指定した変数内の数値は、繰返し回数ごとに自動的に増えていく。ただし、開始数値は0 なので、「0~指定回数-1」の範囲内での増加になる。そのため繰返し回数を表示したい場合は、+1する必要がある。100と指定すれば100回繰り返すけど、変数の変化は0~99の100段階ということである。
計算に使った数値と文字列は「+」演算子では合体できないので、str()によって数値を文字に変換、その後「+」演算子でつないで表示している。以下のように表記しても、ほぼ結果は同様になる。何が違うか見比べてみよう。

2つ目のプログラムは、forが入れ子になっている例である。「%」を指定して偶数と奇数を振り分けて2分岐によって表示するキャラクターを交互に出している。内側のforと外側のfor が、それぞれどのように処理を分担して行っているのかを丁寧に読みたい。

学年
高校生
  • 1
  • 2
  • 3

⑦制御構造3(while)

概要

基本制御の1つである「繰り返し(ループ)」を学習するところである。コンピュータに処理させる最も意味ある部分で、正確な処理を何十回でも何万回でも自動で繰り返させることができる。
forが基本的に”繰り返し条件”や”繰り返し回数”を指定するのに対して、while は”繰り返し条件”だけ、変数も指定しない。そのため、繰返し回数のカウントアップも自前で書き込む必要がある。

指導のポイント

while は指定時には条件を設定するだけで、回数のカウントや変数の増減は自動で行わない。別に変数を用意して、while 内で増減させるようにして初めてfor と同じような使い方ができる。何を基準にして繰り返しをしようとするのかをはっきりさせておかないと、非効率的なプログラムになってしまう。
無条件にして永遠に繰り返す処理(無限ループ)を作り出すこともできるので、指定条件や例外条件でだけ終了するような”ずっと稼働し続ける”タイプのプログラムを書くのに重宝する。

プログラミングのポイント

変数内の値を進める(増やす)作業のことをインクリメント、減らすことをデクリメントというが、算数の数式では見られない独特な書き方をすることを覚えておきたい。これはプログラムの式が算数のような「等辺」でないことが基本である。式の左右は同じではなく「右辺の計算結果を左辺に代入する」だけを行うのがプログラムである。以下の式は、変数num の値を1進める記述である。

2つ目のプログラムは永久ループや無限ループと呼ばれるプログラムで、条件を達成するまでいつまでも繰り返すものである。何回で終了するのかは分からない。最初の answer = 0 は変数の初期化と呼ばれる作業。他のプログラミング言語では変数宣言時には内容が不定となるので、よく行われる作業だ。ただ、Pythonは宣言せずに変数生成時に値を代入できるので不要なのだが、while でいきなり条件判定に変数を利用しているので、そのための初期条件を値として代入している。
input 内ではなくprintで別行でガイダンス文を表示しているのは、入力待ちプロンプトをどこに出すかの違いである。ifは入れ子になっているので、注意して考えさせたい。

学年
高校生
  • 1
  • 2
  • 3

⑧乱数

概要

よく「サイコロを振るように」と例えられるのが乱数である。サイコロは振るたびに、いつも異なる目が偶然性で出てくる。サイコロが6種類しか出せないのに対して、Python のプログラムでは無限とも言うべき数を指定してランダムな値を得ることができる。乱数はゲームなどを作る時に大変重宝する機能である。特徴を覚えて使いこなせれば、様々な応用が利く。
ただし、使う前には必ず宣言が必要となる。何も指定しなくても使える命令群とそうでないもの。モジュールという考え方も含めて学習するステップである。

指導のポイント

乱数に関係する命令群は、今までのようにプログラム内にただ記述しただけでは使えない。プログラムの冒頭で「使います」という宣言を記述必要がある。それが「import」(インポート)である。どのような機能が使えるかはインポートしたモジュールごとに異なる。「random」をインポートすれば、プログラム内で「random.機能」という書き方で「インポートしたrandom モジュール内にある、この名前の機能を使います」という意味になる。
なお、乱数の命令群、例えば「.randint()」などドットから始まる機能はメソッドと呼ばれる。乱数のメソッドは種類によって範囲の終端が異なるので注意したい。

プログラミングのポイント

・乱数を発生させよう
データが入っていないリストresultを宣言し、forによって10回の繰り返し処理を行っている。「.randint()」によって発生させた1から6までのランダムな値を「4 配列(リスト)」で学習した「.append()」によって空のリストresultに代入する(これ例では変数numは出力させていない)。

・じゃんけんゲームを作ってみよう
じゃんけんで使う要素と勝ち負けのパターンをリストで用意し、input()で利用者の手を変数playerに記録。3通りの乱数を発生させてコンピュータ側の手として、利用者との手と比べて勝敗を表示している。
勝敗を判定する記述のブロックが2度出てくるのは、「あいこ」だった場合、もう一度利用者に入力させて、while によって勝ち負けが決まるまで繰り返させるからである。
判定は、0がグー、1がチョキ、2がパーなのだから (3 + player - npc) % 3という式で行っている。これは、もし2(パー)を入力していて、コンピュータが乱数で0 を出していたら、(3 + 2 -0) % 3 = 2 となり、result の3つめのデータ「勝ち」が表示されるという仕組みである。

学年
高校生
  • 1
  • 2
  • 3

⑨合計と平均

概要

単なる四則計算ではなく「集計」と呼ばれる合計と平均を求める。すべての分析の基本となる作業であり、集計のテクニックは他の計算にも応用が利くので、原理をしっかり理解しておきたい。
実はPythonにも表計算ソフトのようなsum関数が備わっているが(「1 関数」で利用する)、ここではそういった関数がどのような仕組みで計算しているのかを知ることができる。

指導のポイント

合計や平均というと、生徒にとっては中間・期末などのテスト結果を思い出す。中間と期末では教科数も違うし、毎回点数も違う。これをどのような考えで集計すればよいのかという問題解決である。
ここでは固定値を入れると毎回同じ答えになってしまうので、先に学んだ乱数によって異なる値を代入している。
合計は、全部の数字(データ)が出揃ってから一気に加算するのではなく、データが1件1件受け取られるたびに、置き場所である変数内に”加算(付け足し)”していく方法で求められる。
平均は合計を個数(件数)で割るため、全体個数が分からないと除算が行えない。学校の各組の人数のように退学や転入が無ければ決まった数(定数)を直に書いて割ればよいが、入力される件数が可変であるとそうはいかない。そこで件数(量)を求める命令(関数)であるlen( )を利用してる。

プログラミングのポイント

「8 乱数」で学んだ学習をそのまま活かす項目である。乱数で0~10までをランダムに発生させ、「.append()」でリストに代入するが、何個代入するかも乱数で決めている(10~20の間)。リストには、毎回異なる個数でランダムな値が格納されるわけである。
forの書き方として、for num in sample_data:とすると、末尾に置いたリストからデータを1つずつ取り出して、変数num に代入するという動作を行わせることができる。リスト操作の基本なので覚えておこう。
「制御構造3(while)」で学んだ右辺の結果が左辺に入るということをカウントアップではなく、値の積算に用いている。現在totalとnumに入っている値を足して、total に入れ直すという動作である。これによって合計を計算している。
平均は合計のプログラムに平均計算と表示を足しただけである。「len()」は対象の中に入っているデータ数や量を求めるものである。だから、average = total / len(sample_data) とすれば、リストsample_data に入っているデータの個数を求め、合計値が入っているtotalを割ることで平均を求めることができるのである。

学年
高校生
  • 1
  • 2
  • 3

⑩関数

概要

単純な繰り返し処理では無く、ある程度まとまった同じ処理を何度もプログラム内に書くのは問題がある。何らかの変更がその部分に行われるたびに、同時に複数箇所も漏れなく正確に変更しなければならない。そもそもプログラム全体が長くなる。
このひとまとまりの処理に名前を付けて切り離し、必要に応じて呼び出す仕組みが「関数」である。ただ単純に呼び出して処理を行わせるだけでなく、値を渡して計算させたり、処理結果を呼び出し元に返させたりなどのデータの受け渡しにも対応している。

指導のポイント

制御構造のifやforなどと同じく、関数として宣言するときの決まった書式が存在する。同じく、インデントを忘れると関数の外側とされてしまうことに注意したい。
関数に渡す値は「引数(ひきすう)」と呼ばれること、関数から返ってくる値は「戻り値」や「返り値」と呼ばれること(英語ではreturn value)は知っておきたい。プログラミング言語の解説書等でも必ず見かける記述である。例えば(他人が作った)関数内の内容が難しくて理解できなくても「何の値を渡せば、どのような結果が返ってくるのか」ということだけがわかれば使えるという、利便性に高い機能である。
主たるプログラムの部分をメインルーチン、関数のような切り離された別の処理の流れをサブルーチンと呼ぶことがある。

プログラミングのポイント

・合計を求める関数を作ろう
「9 合計と平均」で作成した合計を求めるプログラムの計算部分だけを抜き出して関数化したものである。関数を利用するには、関数名が登場するよりも必ず前(上)に、その関数名の定義が行われている必要がある。ここでは、関数にリストのデータを与え、関数内で計算処理し、return で計算結果を返している。返された結果はそのままprint()で表示している。

・用意されている関数を使おう
自前で記述していた合計計算とそれを関数化したget_total 関数の代替として、組み込み関数として用意されているsum()関数を用いた。合計計算の処理内容はブラックボックス化するが、プログラムの見通しは良くなる。

・グローバル変数とローカル変数を使い分けよう1つのプログラム内で複数の関数を定義して使っている例でもある。今回の学習には無いが、関数内から別の関数も呼べるので、複数の関数を扱う場合は記述順序に気をつけること。
ここで定義した関数は、2つとも引数で値は受け取らない。プログラム冒頭で変数var を宣言しているが、refer_to_local_var()関数は内部で同じ名前の変数var に値を入れている。表示結果を見れば分かるが、関数は呼ばれるたびに独自の空間を生成して、同じ名前の変数でも別扱いで保持される。refer_to_local_var()関数内の変数は、他の関数やメインルーチンからは見えない。逆に関数定義の外側にある変数はすべての関数から参照できる。変数が見える範囲のことをスコープという。

学年
高校生
  • 1
  • 2
  • 3

⑪再帰

概要

関数は何らかの一連の処理を記述するだけではなく、別の関数を呼び出して使うこともできる。その時に、条件によって関数である自分自身を呼び出すような記述をすることがある。変化する値だけを引き継がせて処理そのものは同じものを繰り返し行う。それが再帰である。
すべての計算処理で使うわけでは無く、特定の計算や公式で使うと、記述も少なくシンプルにまとまるメリットがある。

指導のポイント

順番に増やしていく・減らしていく、計算結果を再利用して次々に計算を繰り返すなど、制御構造で学んだ繰り返しを関数としてシステマチックに行うと考えるとよいだろう。
「10 関数」で学んだように、関数が呼ばれると独自空間になり、指定しない限り変数の値は共有されない(ローカル変数とグローバル変数)。これは再帰呼び出しで自分自身の関数を呼んだときも同じで、変数の値は同じ名前でも上書きされず、独自の空間で持ち続けることに注意したい。

プログラミングのポイント

・階乗を求める関数を作ろう
階乗とは、例えば4 の階乗なら「4×3×2×1」というように階段を降りるように1つずつ乗数(かける数)が減っていく計算のことである。0 と1 の階乗は1と決まっているので、計算せずにそのまま値を返している。
与えられた数字から1をマイナスしつつ、全く同じ計算を繰り返すわけなので、同じ計算をする自分自身の関数を num - 1として呼び出しているのである。渡される値は1ずつ減っていくので、結果的に階乗を求めることができる。

・最大公約数を求める関数を作ろう
大きな数字の最大公約数を求めるには、小さい数字から割れるかどうか試して、どんどん大きな数字を繰り返し試していく方法を思い浮かべる。これは非常に時間がかかり手間である。そこで、ユークリッドの互除法という方法で計算するのが良い。これは2つの数字を渡されたら割り算を行って,出た余りの数字を次の割る数に使うということを繰り返すことで余りが無くなった時の値が最大公約数であるというものである。
プログラムでは余りを求める「%」を使って、計算している。関数内のプログラムの構造は階乗計算とほぼ同一である。戻り値としてy と割った余りを自分自身の関数を呼んで渡し続けることで答えを求めている。