第10講 関数の再帰的呼び出し=関数の自己再帰の学習
第2話 足し算を関数の自己再帰で行うと?


第1話問題解答例
public class A{
  public static void main(String args[]){
    f(0);
  }
  public static void f(int a){
    System.out.println("初心者のためのJava 入門 基礎から応用まで");
    if(a+1<20)f(a+1);
  }
}


では関数の再帰的呼び出しを使い
1+2+3+・・・+n
を求めることを考えてみましょう。
一応問題としますが、今回は少し考えて見当がつかない場合は30行下の解答例を見てください。





















1+2+3+・・・+nの解答コード例
import java.io.*;
public class A{
  public static void main(String args[]) throws IOException{
    BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("1からnまでの和をもとめます。");
    System.out.println("いくつまで足すかキーボードから入力してください。");
    System.out.print ("n=");
    int n;
    n=Integer.parseInt(a.readLine());
    System.out.print ("1からnまでの和=");
    System.out.println(f(n));
  }
  public static int f(int n){
    if(n-1>=0){
      a+=f(n-1);
    }
    else{
      return(0);
    }
    return(n);
  }
}
(ピンクの部分の使い方忘れてしまった方は、
第5講 for文を理解しよう
 第3話 キーボードから値を取得する
を参照してください。)

自分が自分を呼び出すという言い方をしてきました。
f()がf()を呼び出すのですから、この言い方は正しいように見えます。
しかし、正確に言うと呼ぶ出すf()と呼び出されるf()は次元が違います。

私は、関数の再帰的呼び出しをいつも入れ子式人形の比喩で説明します。
ロシアのマトリョーシカ人形(入れ子式人形ウィキペディアより)や七福神人形は、入れ子式人形になっています。
関数が自分を呼び出すのは、外側の人形がひとつ内側の人形を呼び出すのに相当します。
自分が自分を呼び出すといっても、
基本的に自分と同じ形態の内側にある人形を呼び出しているのです。
自己再帰と呼ぶ場合もありますが、
あくまで自分と基本的に同じ仕組みをした入れ子式人形の内側への進展です。
自己再帰とは呼び出した内側の人形から自分へと戻ってくる事態を指しています。
自分が自分を呼び出すとき、呼び出す自分と呼び出される自分は、
入れ子式人形とそのひとつ内側の人形に対応します。
呼び出す自分が外側の人形であり、呼び出される自分は内側の人形なのです。
同じ自分でも異なる人形です。
次元が違うというのは、同じ形態の入れ子式人形であっても、
内側の人形から見ればひとつ外側の人形、
外側の人形から見ればひとつ内側の人形というように、
違う人形であることを指しています。

入れ子式の人形の話はもちろん比喩ですが、
まさに関数の再帰的呼び出し=関数の自己再帰と同じ構造をもっています。
より内なる自己へと遡及していって一番小さい人形にたどり着いたときに、
自分の本質を発見するのです。
今プログラムにおいては、自己の本質とは0です。
一番小さい人形まで遡及した後はじめて、0をいう値を発見しそれがreturnによって返されます。
どこに返されるかというと内側から2番目の人形へとです。
aは実は次元番号を示しています。
といっても0から始まりますので、aが指し示している人形番号はa+1です。
配列でa[3]は4番目であったことを思い出してください。
普通我々は1から数え始めますが、
JavaやC++などのプログラム言語は0から数え始めます。
ですから普通に意味の何番目にするには、a+1番目としなければならないのです。

a=0のときは、内側からa+1番目の人形、すなわち一番内側の人形ですし、
a=1のときは、内側からa+1番目の人形、すなわち内側から2番目の人形ですし、
a=2のときは、内側からa+1番目の人形、すなわち内側から3番目の人形等です。

内側から1番目の人形が、内側から2番目の人形に0の値を返します。
2番目の人形はaの値1にその0を加えて、1にしてから3番目の人形にその1を返します。
3番目の人形は、aの値2に2番目の人形から返ってきた値1を加えた値3を4番目の人形に返します。
4番目の人形は、aの値3に3番目の人形から返ってきた値3を加えた値6を5番目の人形に返します。
5番目の人形は、aの値4に4番目の人形から返ってきた値6を加えた値10を6番目の人形に返します。
                     ・
                     ・
                     ・
つまり、今の動きを見ると
0+1+2+3+4+5+6+・・・+n
というわけです。
では今回のプログラムを参考に
n!=1×2×3×・・・×n
を求めるプログラムを考えましょう。


第1話へ 第3話へ

戻る

VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための Java 入門 サイト 基礎から応用まで第1部
初心者のための Java 入門 サイト 基礎から応用まで第2部
初心者のための Java 入門 サイト 基礎から応用まで第3部