たぶん、以下があなたを理解するのに役立つでしょう。コンピューターは、計算しているだけの関数と同じ関数を呼び出すかどうかは気にしません。再帰とは何か、リストや自然数など、それ自体が構造によって再帰的である多くのもので機能する理由を理解すれば、再帰に魔法のようなものは何もありません。
- 定義: 0 の階乗は 1 です
- 定義: 0 より大きい数 n の階乗は、その数とその前の階乗の積です。
したがって
5! = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! = 5*4*3*2*1*0! = 5*4*3*2*1*1 = 120
したがって、帰納法による証明について聞いたことがある場合は、次のようになります。
- 基本ケースのいくつかのプロパティを証明します。
- この性質が n に対して真であれば、n の後継者に対しても真であることを証明します。
- これは、基本ケースと後続のすべてのケースでプロパティが保持されることの証明であると結論付けます。
例:偶数の二乗は4の倍数であることを帰納法で証明!
- 0 の 2 乗は 0 で、4 の倍数です。
- n を偶数とし、その二乗 n² は 4 の倍数
(2+n)*(2+n)
です4+2n+2n+n²
。これは 4 の倍数です。なぜなら、n² は仮定によるものであり、4 は 1 であり、2n+2n = 4n
4 の倍数でもあり、4 の倍数の和は分配法則により 4 の倍数だからです。4a + 4b = 4(a+b)
- QED このプロパティは、0 (基本ケース) に対して保持され、n に対して保持される場合は (2+n) に対して保持されます。したがって、2、4、6、8 .... およびその他すべての偶数に適用されます。
(2a)²
(より簡単な証明は、4 の倍数である=を観察すること4*a*a
です。)
再帰的なプログラムを書くことは、帰納法による証明をすることに非常に似ています:
- ベースケースの計算を書きます。
- 非基本ケースの場合、結果を計算する方法はわかっています (たとえば、 がわかっている
n! = n * (n-1)!
ので、必要な関数は今書いている関数なので、 だけ書き留めます!
- このプログラムは、ベース ケースとベース ケースの後続ケースの正しい値を計算すると結論付けることができます。
678!
それでも正しい答えが計算されない場合int
は、大きな数にはあまり適していないようなデータ型を使用したという事実に関係しています (または、別の言い方をすれば、すべてを 2^32 ムーロで計算します)。さらに、使用可能な数値の半分を負の数値として解釈することを主張するソフトウェアを使用します。
これが機能する理由は、コンピューターのハードウェアやプログラミング言語とは関係ありません。前に述べたように、アイテム (リスト、ツリー、セット、自然数) の再帰的な構造の結果です。
初心者がよく犯す間違いは、基本的なケースを無視して複雑さに惑わされることです。基本的なケースから始めることを常にお勧めします。これがあれば、関数が存在すると仮定して、より複雑なケースで使用することができます。