「帰納的に」と「再帰的に」は非常に似ていることを意味しますか?
たとえば、決定された最初のk成分に基づいて最初のk + 1成分を決定することによりn次元ベクトルを決定し、最初の成分で初期化されるアルゴリズムがある場合、それは再帰的または帰納的に機能しますか?私は「再帰的に」使用してきましたが、今日誰かが「帰納的に」それを言いました。
「帰納的に」と「再帰的に」は非常に似ていることを意味しますか?
たとえば、決定された最初のk成分に基づいて最初のk + 1成分を決定することによりn次元ベクトルを決定し、最初の成分で初期化されるアルゴリズムがある場合、それは再帰的または帰納的に機能しますか?私は「再帰的に」使用してきましたが、今日誰かが「帰納的に」それを言いました。
回答:
いいえ。ただし、他の人からの理由によるものではありません。再帰と帰納の違いは、再帰が「トップダウン」であり、帰納が「ボトムアップ」であるということではありません。帰納法は "primitve recursion"と呼ばれるものに同型ですが、一般に、再帰法は厳密に帰納法よりも強力です。
トップダウンとボトムアップの違いは取るに足らないものです。「トップダウン」プリミティブ再帰プログラムは、機械的に「ボトムアップ」に変換できます。実際、帰納法による証明は再帰プログラムに変えることができます。帰納的構造の計算のフレームワークで、すべての自然数が不正であることを証明したい場合は、nが不正であるという証明を構築するための再帰呼び出しを行うことにより、nが不正であるという証明を構築する関数として記述します。 1は不正解です。
帰納の重要な要素は、物事はより小さな物事に関して定義され、有限の数のステップの後に「ボトムアウト」することです。すべての自然数が0または小さい自然数の後継のいずれかであるため、自然数は帰納的です。すべてのリストが空であるか、要素と小さなリストに分解(「展開」)できるため、リストは帰納的です。
ただし、再帰的なプログラムは、小さなもので書かれていない場合があります。たとえば、次のCollatz関数を見てみましょう。
fun collatz(n)
if n <= 1
return 0;
else if n % 2 == 0
return 1 + collatz(n / 2)
else
return 1 + collatz(3 * n + 1)
end
この関数はトップダウンにもボトムアップにもならないため、自然数に対して帰納的ではありません。
それを帰納的に扱う命令があるかもしれませんが、ほとんどの場合、単に方法はありません。無限ストリーム上の関数はその良い例です。実際、ストリームは「誘因的」タイプの典型的な例です。
Bob Harperの「Practical Foundations for Programming Languages」は、オンラインで無料で入手でき、帰納型、共帰型、および再帰型の入門書です。
私にとってそれは主に視点の問題です。小さいオブジェクトに基づいてオブジェクトを定義する場合、帰納的にそれを行うので、ボトムアップです。問題を小さな部分に分割して解決する場合、それを再帰と同じ方法で解決します。これはトップダウンです。
(編集)PS。数学の姉妹部門の再帰的対帰納的定義の同様の質問を参照してください。カールママートの答えから引用します。
私の最高の説明は、「何もない状態で」オブジェクトのセットを定義するときに「帰納的定義」がより一般的であり、既存のオブジェクトのコレクションに対して関数を定義するときに「再帰的定義」がより一般的であるということです。
しかし、より重要なこと:
眠りに落ちる価値はない
いいえ、同じではありません。そして、あなたは正しいです(私はあなたが説明しているアルゴリズムについて仮定しています):それは再帰的です。
その理由は、辞書またはウィキペディアで読むことができる両方の単語の定義です。
帰納法(「数学的帰納法」を想定)は、議論のすべてのケースが真であることを証明することについて具体的に述べています。
再帰とは、具体的には、同じプロセス内で何らかの方法で繰り返される可能性があるプロセスに関するものです。
RE:他の人の答え:
他の人の答えを見た後、なぜ混乱があるのか理解できます。データ構造、関数、言語を定義するときに、一部の理論家は「帰納的」と「再帰的」を紛らわしい方法で使用しているようです(この質問へのコメントを参照)。Koppelの回答(現在の投票数が最も多い場合でも)が本当に混乱を反映しているとは思いません。アルゴリズムについて話しているので、「帰納的アルゴリズム」があるとは言いません。それは不必要な分類だと思います。