┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃.&&&& **** %%%%. JavaScript&Javaで目指そう!基本情報技術者試験 ┃
┃&&&&&&******%%%%%% 執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp ┃
┃'&┃&''*┃*''%┃%' 発行 江口昌宏 *** ┃
┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
第14号 2002/03/0x
再帰関数
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
プログラムを作成する上での注意事項:
Windows とIE を前提としています。
拡張子を表示するに設定してください。
-------------------------------------------------------------------------
▼ 再帰とは
第13号のJマガで,1 から n までの整数を順番に足しているプログラムを扱い
ました。
例 j13-01 関数サンプル
関数 j13-01.htm
ここで,xtasu関数の部分だけ注目します。
これは,1 から x までの整数を足しこんでいっています。プログラムでは,
ループを使って,x 回繰り返すと書いています。
もし,1から10までの合計をこれを手で計算するときは,
1 + 2 + 3 + ... + n
と計算するのが普通です。このやり方を分析してみます。
1 + 2 + 3 + ... とやるのは,1 に 2 を足して,3。それに,3 を足して,6。
それに,... とやるわけです。つまり,xtasu(2) は,xtasu(1)+2で,xtasu(3)は,
xtasu(2) +3 です。このやり方をJavaScripで書くと
となります。これを x 回 for 文で繰り返しながら合計を出していくプログラム
と比較すると,for 文の繰り返しの方が分かりやすいかもしれません。しかし,
x = 1 のときは,xtasua(1) は,1
x = 2 のときは,今計算した,xtasu(1) に 2 を足す
x = 3 のときは,今計算した,xtasu(2) に 3 を足す
とプログラムを読み取りをすると簡単なプログラムに見えます。
この関数が,プログラムの名で使用されるときは,document.write(xtasu(10));
のように使用されるので,コンピュータ内部では,そのつど,順に,
xtasu(10) = xtasu(9) + 10
xtasu(9) = xtasu(8) + 9
xtasu(8) = xtasu(7) + 8
xtasu(7) = xtasu(6) + 7
xtasu(6) = xtasu(5) + 6
xtasu(5) = xtasu(4) + 5
xtasu(4) = xtasu(3) + 4
xtasu(3) = xtasu(2) + 3
xtasu(2) = xtasu(1) + 2
xtasu(1) = 1
ここで,xtasu(1) = 1 が分かったので,逆戻りして,
xtasu(2) = 1 + 2 = 3
xtasu(3) = 3 + 3 = 6
xtasu(4) = 6 + 4 = 10
xtasu(5) = 10 + 5 = 15
xtasu(6) = 15 + 6 = 21
xtasu(7) = 21 + 7 = 28
xtasu(8) = 28 + 8 = 36
xtasu(9) = 36 + 9 = 45
xtasu(10) = 45 + 10 = 55
と計算します。xtasu(1) まで行って,終点があって,そこから,帰ってきて
xtasu(10) の答えがわかります。
このように,再び帰ってくるので,再帰(さいき)といいます。この場合は,
@関数を再帰的に定義した」といわれます。この再帰を利用した関数を再帰関数,
再帰を利用したプログラムを再帰プログラムと呼ぶます。
-------------------------------------------------------------------------
▼ 再帰を可能にするには,
再帰関数は,自分で自分を利用しています。xtasu(10) = xtasu(9) + 10のよう
に,xtasu(10) を求めるために,xtasu(9)を利用しています。そのため,関数の実
行において,関数が,自分で自分を呼ぶことを可能にするからくりが必要です。
PASCAL,C,VB, JavaScriptやJavaではこれが可能です。COBOL のような言語では,
このような再帰関数は,一般的に実現が困難です。
再帰関数の実行において,
xtasu(10) = xtasu(9) + 10
xtasu(9) = xtasu(8) + 9
xtasu(8) = xtasu(7) + 8
xtasu(7) = xtasu(6) + 7
xtasu(6) = xtasu(5) + 6
xtasu(5) = xtasu(4) + 5
xtasu(4) = xtasu(3) + 4
xtasu(3) = xtasu(2) + 3
xtasu(2) = xtasu(1) + 2
xtasu(1) = 1
もどって,
xtasu(2) = 1 + 2 = 3
xtasu(3) = 3 + 3 = 6
xtasu(4) = 6 + 4 = 10
xtasu(5) = 10 + 5 = 15
xtasu(6) = 15 + 6 = 21
xtasu(7) = 21 + 7 = 28
xtasu(8) = 28 + 8 = 36
xtasu(9) = 36 + 9 = 45
xtasu(10) = 45 + 10 = 55
のような計算が内部で実行されました。コンピュータが,xtasu(10)を実行したと
きには,「xtasu(9)の答えが分かったら,それに10を足す」ということを記憶して,
xtasu(9)の計算に移ります。xtasu(9)の計算をするときに,xtasu(10)の記憶を消
さないために,xtasu()という関数は,実行するたびに,途中結果をそれぞれ残し
ておく必要があります。この途中結果を残すというからくりが,再帰関数のため
に必要です。
-------------------------------------------------------------------------
▼ 試験にこう出た
その1
プログラムの構造に関する次の記述の下線部 a〜d に,誤りが一つある。誤り
の箇所と正しい字句の適切な組合せはどれか。
自分自身を呼び出して使うことができるサブルーチンは,a 再帰的 であると
 ̄ ̄ ̄ ̄
いう。このようなサブルーチンを実行すると,局所変数,b 仮引数 及び戻り番
 ̄ ̄ ̄ ̄
地の格納領域が c スタック に確保され,d FIFO (First In First Out) 方式で
 ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
制御される。
┌───────┬────────────┐
│ 誤りの箇所 │ 正しい字句 │
┌─┼───────┼────────────┤
│ア│ a │再入可能 │
├─┼───────┼────────────┤
│イ│ b │実引数 │
├─┼───────┼────────────┤
│ウ│ c │待ち行列 │
├─┼───────┼────────────┤
│エ│ d │LIFO (Last In First Out)│
└─┴───────┴────────────┘
■キーワード■ プログラム構造,再帰,引数,スタック,キュー,FIFO
■解答■
ネットワークスペシャリスト午前平成12年問50
┌───────┬────────────┐
│ 誤りの箇所 │ 正しい字句 │
┌─┼───────┼────────────┤
│エ│ d │LIFO (Last In First Out)│
└─┴───────┴────────────┘
その2
n の階乗を再帰的に計算する関数 F(n) の定義において,次の記述中の a に
入れるべき式はどれか。ここで,n は非負の整数とする。
n > 0 のとき,F(n)=【 a 】
n = 0 のとき,F(n)= 1
ア F(n)×F(n−1)
イ n×F(n−1)
ウ (n−1)×F(n)
エ (n−1)×F(n−2)
■解答■
一種午前平成12年問12
イ n×F(n−1)
------------------------------------------------------------------------
▼ 次号の予定
簡単なアルゴリズム
感想は,斎藤まで,suehiro@he.mirai.ne.jp
広告等のお問い合わせ:***
------------------------------------------------------------------------
▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。
過去の修正版等
http://www.mirai.ne.jp/~suehiro/java/jmaga/
登録・削除および広告の案内
http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
------------------------------------------------------------------------
▼ 著作権について
このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ
フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。
本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を
必要とします。
------------------------------------------------------------------------
▼アンケート(以下を返信してください)
この号のJマガは役立ったあるいは勉強になりましたか?
該当するものだけ残してください。
5: 大いに,YES
4: YES
3: 普通
2: NO
1: 大いに,NO
その他