IT関連勉強中

素人が勉強してます。間違い等あれば指摘していただけると助かります。

①初心者がアルゴリズムの再帰を理解しようと努めるが。。

#include <stdio.h>

int Print(int n){ 
    if(n == 0)       
        return 0;
    else {
        printf("%d\n",n);
        return Print(n-1); // 自分自身への再度の再帰呼び出し
    }
}

int main(void)
{
    Print(3);
    return 0;
}

↑これは比較的分かりやすい。出力結果は

3
2
1

になる。まずmain関数で数字の3を引数にしてPrint関数を呼び出す。ここで着目しておきたいのは、Print(int n)となっていて変数nの値を増減させてるわけではないが、Print(int n)の(int n)の部分にn+1やらn-1した値を渡しているので、Print関数から見れば、「お、3が渡されてきた。」「お、次は2が渡されてきた。」「お、次は1が渡されてきた」となるわけだ。くどいがnの値は変わっていない。Print関数に渡される値が、この場合では(n-1)として-1されて渡されているのだ。Print関数で数字の3が渡されるがif(n == 0) の部分はスルーしてelse部分のprintfが実行されて数字の3が出力される。次にPrint(n-1)で自分自身を呼び出す。このときnは3なのでPrint(3-1)つまりPrint(2)で2が引数として新たに自分自身であるPrint関数に渡されるのだ。自分自身といっても、メモリ上に新たにコピーされたPrint関数なので別物であるとイメージするとよいと思う(多分)。そうやって、再帰関数は再帰で自分自身を呼び出すたびにコピーを作っているようなイメージだと思う。