ウィキペディアの記事は高度すぎて理解できません。誰かに簡単な説明をお願いできますか?
ウィキペディアの記事は高度すぎて理解できません。誰かに簡単な説明をお願いできますか?
回答:
2つの用語のコンテキストは一般に異なります。
自己参照はデータのコンテキスト内にあります。同じ型の何かへの参照を含むデータ型があります。
再帰はコードのコンテキスト内にあります。自分自身を呼び出す関数またはプロシージャがあります。
例:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
ここだ再帰関数(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つの要素のみを含む循環リンクリストです。かわいいですが、あまり役に立ちません。自己参照の一種であるため言及しましたが、人々が自己参照データ型について話すとき、それが通常意味することではありません。
再帰は、ほとんどが有用なものであり、何らかの初期値があるという意味で、特定の数の手順の後で終了することが期待されています。役に立たない悪い再帰がない限り。
自己参照は、それ自体は正確な再帰ではありませんが、再帰があることが示されている場合があります。
再帰は、同じプロセスを呼び出すことによって処理する必要があります(多くの場合、異なるパラメーターを使用)。関数を頻繁に使用していて、それらの関数がそれ自体を呼び出している場合でも、技術的には、たまたま出身の場所のように見える新しいステップに入ります。
自己参照とは、何かがそれ自体を参照することを意味します。クラスはを使用して自己参照にすることができますthis
が、意味のある再帰的ではありません。
recursion
自分自身を呼び出す関数をself-reference
指し、自分自身を参照するオブジェクトを指します。