「再帰」と「自己参照」の違いは何ですか?


8

ウィキペディアの記事は高度すぎて理解できません。誰かに簡単な説明をお願いできますか?


2
それらは実際に比較可能な用語ではありません。recursion自分自身を呼び出す関数をself-reference指し、自分自身を参照するオブジェクトを指します。
Jakob Weisblat 2013年

2
@GerryMyersonは、再帰呼び出し自体を呼び出すのが正しいでしょう。一方、自己参照は、それ自体を指し?
skullpatrol 2013年

1
@skullpatrolは基本的にはいですが、根本的な違いを見逃しているように感じます。同じ種類のものには適用できません。
Jakob Weisblat 2013年

1
番号。自己参照は、オブジェクト自体を参照するオブジェクト(ウィキペディアのOOPに関する記事を参照)を指します。再帰は、オブジェクトではなく関数またはメソッドを指します。
Jakob Weisblat 2013年

4
@ Jake223私はあなたがどこから来たのか知っていますが、リンクされたリストのような構造が再帰的に定義されていると言うこともできます(定義には基本ケースと再帰ステップがあります)、そして再帰関数は自己参照であることは間違いありません。
Caleb

回答:


14

2つの用語のコンテキストは一般に異なります。

自己参照はデータのコンテキスト内にあります。同じ型の何かへの参照を含むデータ型があります。

再帰はコードのコンテキスト内にあります。自分自身を呼び出す関数またはプロシージャがあります。

例:

def factorial(n):
if n == 1:
    return 1
else:
    return n * factorial(n-1)

スタックオーバーフローの2つのタグ定義は次のとおりです。コンピューターサイエンスの再帰は、問題の解決方法であり、問​​題の解決策は同じ問題の小さなインスタンスの解決策に依存します。自己参照とは、プログラム(または論理文)が直接または間接的にそれ自体を参照する機能です。
スカルパトロール2013年

そしてタグについては、それはほぼ正しいようです。タグの奇妙なコーナーケースに陥るのは望ましくありません。そして、それはおそらくあなたが今も考えたいレベルに関するものです。
jmoreno 2013年

10

ここだ再帰関数(Cでは):

unsigned int fibonacci(unsigned int n)
{
    unsigned int result = 1;

    if (n > 1)
        result = fibonacci(n - 1) + fibonacci(n - 2);

    return result;
}

関数fibonacci()内へのこれら2つの呼び出しfibonacci()は、再帰呼び出しです。

ここだ自己参照データ構造は

struct ListNode {
    char *data;
    struct ListNode *next;
}

最初の要素はdata、ある種のデータへのポインタにすぎません。2番目の要素はnext、別のListNode構造体へのポインターです。2つ以上のListNode構造体がある場合はnext、1つのポインタを別の構造体のアドレスに設定するなどして、リンクリストを作成できます。構造の定義はそれ自体を参照するため、構造は自己参照です。あなたが本当に夢中になりたいなら、あなたはこれをすることができます:

struct ListNode *node = malloc(sizeof(struct ListNode));
node->data = someString;
node->next = node;

今、あなたは、自己参照の異なる種類を持っている-それは単なる定義ではありませんstruct ListNodeあなたが設定した...それは自身を参照nextのポインタnodeを指すようにしnode、それ自体。これは、1つの要素のみを含む循環リンクリストです。かわいいですが、あまり役に立ちません。自己参照の一種であるため言及しましたが、人々が自己参照データ型について話すとき、それが通常意味することではありません。


1
再帰は、参照されている(または呼び出されている)オブジェクトが関数である自己参照の特殊なケースであると言って間違いありませんか?
skullpatrol 2013年

2
確かに、再帰呼び出しは自己参照の一種であると言えます。時には用語はないが、コードに関して、ほぼ互換性があります。たとえば、「GNUはUnixではない」という意味であるため、ほとんどの人は「GNU」を「再帰的な頭字語」と呼びますが、「自己参照頭字語」と呼んでも間違いではありません。
Caleb

@Caleb Listは再帰的なデータ型であるため、これは特に良い例ではありません。だからあなたは実際に再帰の別の例を示しています!
Andres F.

@AndresF。再帰的なデータ型ではない自己参照データ構造の例を挙げられますか?などのソースこれこれを使用用語「自己参照」リンクリストのような構造のために他の人が「再帰的な」を使用しながら。私の回答で用語を明確に区別できない場合、それは用語が正確に同義ではないが、意味が非常に近いためです。
Caleb

@Calebおっと、ごめんなさい。それらが非常に近い意味であると言っているなら、私たちは同意し、私はあなたを誤解しました!
Andres F.

6

再帰は、ほとんどが有用なものであり、何らかの初期値があるという意味で、特定の数の手順の後で終了することが期待されています。役に立たない悪い再帰がない限り。

自己参照は、それ自体は正確な再帰ではありませんが、再帰があることが示されている場合があります。


5
再帰を、根拠のあるリレーションで実行される構造として定義する場合、再帰が終了しないという事実は、無限の減少シーケンスに対応します。したがって、自己参照「再帰」はまったく再帰ではありません。これは、ある時点で停止するためにアルゴリズムが必要とされる方法によく似ています。

5
この文について:「この文には5つの単語があります。」これは自己参照ですが、終了しない再帰はありません。また、再帰は一般的に自己参照を伴う必要があるとは思いません。再帰的なC関数をバイナリマシンコードにコンパイルする場合、マシンコードには自己参照がありません。最も言えるのは、自己参照を終了することが再帰を定義する1つの可能な方法であるということです。

2
はい、この私の説明は決して完璧ではありません。「OPが自己参照を再帰として解釈しようとしている」場合に備えて、単純化しようとしています。自己参照が常に再帰を終了しないことを意味するわけではありません。

再帰は、参照されている(または呼び出されている)オブジェクトが関数である自己参照の特殊なケースであると言って間違いありませんか?
skullpatrol 2013年

5

再帰はアクションを意味します。

例:

  • 自分自身を呼び出す関数
  • *または+(つまり反復)一致を実行する正規表現

技術的には、再帰には終了状態が必要ですが、必須ではありません。

自己参照は構造を意味します。

例 アタッチされているオブジェクトを参照するインスタンスメソッド。


2

再帰は、同じプロセスを呼び出すことによって処理する必要があります(多くの場合、異なるパラメーターを使用)。関数を頻繁に使用していて、それらの関数がそれ自体を呼び出している場合でも、技術的には、たまたま出身の場所のように見える新しいステップに入ります。

自己参照とは、何かがそれ自体を参照することを意味します。クラスはを使用して自己参照にすることができますthisが、意味のある再帰的ではありません。


したがって、再帰には同じプロセスを呼び出すことによるプロセスが必要ですが、自己参照は「それ自体の呼び出し」ですか?
skullpatrol 2013年

@skullpatrol-いいえ。自己参照はこれまで何も呼び出す必要はありません。
Telastyn 2013年

したがって、再帰には同じプロセスを呼び出すことによるプロセスが必要ですが、自己参照は「それ自体の参照」ですか?
skullpatrol 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.