Sự khác biệt giữa các lần đệ quy và khác nhau là gì?


8

Các bài viết trên wikipedia quá cao cấp để tôi hiểu, ai đó có thể cho tôi một lời giải thích đơn giản không?


2
chúng không thực sự có thể so sánh các điều khoản. recursionđề cập đến một hàm gọi chính nó trong khi self-referenceđề cập đến một đối tượng tham chiếu chính nó.
Jakob Weisblat

2
@GerryMyerson sẽ đúng khi nói các cuộc gọi đệ quy ; trong khi tự tham khảo đề cập đến chính nó?
Skullpatrol

1
@skullpatrol về cơ bản là có, nhưng tôi cảm thấy như bạn đang thiếu một sự khác biệt cơ bản - chúng không thể áp dụng cho cùng một loại điều.
Jakob Weisblat

1
Không. Tự tham chiếu đề cập đến một đối tượng tái hiện chính nó (xem bài viết của wikipedia về OOP) các đệ quy đề cập đến một hàm, hoặc phương thức, không phải là một đối tượng.
Jakob Weisblat

4
@ Jake223 Tôi biết bạn đến từ đâu, nhưng bạn cũng có thể nói rằng một cấu trúc như danh sách được liên kết được xác định đệ quy (định nghĩa có trường hợp cơ bản và bước đệ quy), và không có nghi ngờ rằng các hàm đệ quy là tự tham chiếu .
Caleb

Câu trả lời:


14

Bối cảnh của hai điều khoản nói chung là khác nhau.

Tự tham chiếu là trong ngữ cảnh của dữ liệu - bạn có một loại dữ liệu có chứa một tham chiếu đến một cái gì đó cùng loại.

Đệ quy nằm trong ngữ cảnh của mã - bạn có một hàm hoặc thủ tục tự gọi nó.

Thí dụ:

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

Dưới đây là hai định nghĩa thẻ trên Stack Overflow: Recursion trong khoa học máy tính là một phương pháp giải quyết vấn đề trong đó giải pháp cho vấn đề phụ thuộc vào giải pháp cho các trường hợp nhỏ hơn của cùng một vấn đề. Tự tham khảo là khả năng của một chương trình (hoặc câu logic) để chỉ chính nó, trực tiếp hoặc gián tiếp.
Skullpatrol

Và đối với các thẻ, điều đó có vẻ đúng. Bạn không muốn vào các trường hợp góc lẻ cho một thẻ. Và có lẽ là về mức độ bạn muốn nghĩ bây giờ là tốt.
jmoreno

10

Đây là một hàm đệ quy (trong C):

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

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

    return result;
}

Hai cuộc gọi đến fibonacci()bên trong fibonacci()hàm là các cuộc gọi đệ quy .

Đây là cấu trúc dữ liệu tự tham chiếu :

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

Phần tử đầu tiên, datachỉ là một con trỏ tới một loại dữ liệu nào đó. Phần tử thứ hai next, là một con trỏ đến ListNodecấu trúc khác . Nếu bạn có hai hoặc nhiều ListNodecấu trúc, bạn có thể đặt nextcon trỏ của một thành địa chỉ của một cấu trúc khác, v.v. và sau đó bạn có một danh sách được liên kết . Cấu trúc là tự tham chiếu vì định nghĩa của cấu trúc đề cập đến chính nó. Nếu bạn muốn trở nên điên rồ, bạn có thể làm điều này:

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

Bây giờ bạn đã có một loại tham chiếu bản thân khác - đó không chỉ là định nghĩa của struct ListNodechính nó ... bạn đã đặt nextcon trỏ trỏ nodeđến nodechính nó. Đây là một danh sách liên kết tròn chỉ chứa một yếu tố. Dễ thương, nhưng không hữu ích lắm. Tôi đề cập đến nó bởi vì nó là một loại tự tham chiếu, nhưng đó không phải là ý nghĩa của mọi người khi họ nói về các kiểu dữ liệu tự tham chiếu.


1
Có đúng không khi nói rằng đệ quy là một trường hợp đặc biệt của tự tham chiếu trong đó đối tượng được gọi (hoặc được gọi) là một hàm?
Skullpatrol

2
Chắc chắn, bạn có thể nói rằng một cuộc gọi đệ quy là một hình thức tự tham khảo. Đôi khi các điều khoản gần như có thể thay thế cho nhau, mặc dù không liên quan đến mã. Ví dụ, hầu hết mọi người sẽ gọi "GNU" là "từ viết tắt đệ quy" bởi vì nó là viết tắt của "GNU không phải là Unix", nhưng không ai nói rằng bạn đã sai nếu bạn gọi nó là "từ viết tắt tự tham chiếu".
Caleb

@Caleb Đây không phải là một ví dụ đặc biệt tốt, vì Danh sách là loại dữ liệu đệ quy . Vì vậy, bạn đang thực sự hiển thị một ví dụ khác về đệ quy!
Andres F.

@AresresF. Bạn có thể đưa ra một ví dụ về cấu trúc dữ liệu tự tham chiếu không phải là kiểu dữ liệu đệ quy không? Các nguồn như thế nàyđiều này sử dụng thuật ngữ 'tự tham chiếu' cho các cấu trúc như danh sách được liên kết trong khi các nguồn khác sử dụng 'đệ quy'. Nếu câu trả lời của tôi không phân biệt rõ ràng giữa các thuật ngữ, thì đó là vì các thuật ngữ này không đồng nghĩa chính xác, nhưng rất gần về nghĩa.
Caleb

@Caleb Rất tiếc, xin lỗi. Nếu bạn đang nói họ rất gần gũi về ý nghĩa, thì chúng tôi đồng ý và tôi đã hiểu lầm bạn!
Andres F.

6

Các cuộc thu hồi, hầu hết là hữu ích, dự kiến ​​sẽ chấm dứt sau một số thủ tục nhất định theo nghĩa là có một số giá trị ban đầu. trừ khi bạn có một đệ quy xấu mà vô dụng.

Tự tham khảo, bản thân chúng không chính xác thu hồi nhưng có thể được hiển thị để có đệ quy trong trường hợp chúng thường không bao giờ chấm dứt.


5
Nếu bạn định nghĩa đệ quy là một công trình được thực hiện trong một mối quan hệ có cơ sở, thì thực tế một đệ quy không chấm dứt tương ứng với một chuỗi giảm vô hạn - và do đó "đệ quy" tự tham chiếu hoàn toàn không phải là đệ quy. Điều này giống như cách một thuật toán được yêu cầu dừng lại tại một số điểm.

5
Điều gì về tuyên bố này: "Câu này có năm từ." Đó là tự giới thiệu, nhưng tôi không thấy bất kỳ đệ quy nào. Tôi cũng không nghĩ rằng đệ quy thường phải liên quan đến tự tham khảo. Nếu bạn biên dịch hàm C đệ quy thành mã máy nhị phân, mã máy không có bất kỳ tự tham chiếu nào trong đó. Tôi nghĩ rằng hầu hết bạn có thể nói là việc tự tham chiếu chấm dứt là một cách có thể để xác định đệ quy.

2
Vâng, đây là lời giải thích của tôi không có cách nào hoàn hảo. Tôi chỉ đang cố gắng đơn giản hóa trong trường hợp "OP đang cố gắng diễn giải một số tài liệu tham khảo bản thân là các lần tái diễn". Tôi không có nghĩa là tự tham khảo luôn luôn không chấm dứt thu hồi.

Có đúng không khi nói rằng đệ quy là một trường hợp đặc biệt của tự tham chiếu trong đó đối tượng được gọi (hoặc được gọi) là một hàm?
Skullpatrol

5

Đệ quy hàm ý hành động.

Ví dụ:

  • một chức năng gọi chính nó
  • một regex thực hiện khớp * hoặc + (nghĩa là lặp đi lặp lại)

Về mặt kỹ thuật, đệ quy nên có trạng thái thoát nhưng đó không phải là một yêu cầu.

Tự tham khảo ngụ ý cấu trúc.

Ví dụ. Một phương thức thể hiện tham chiếu đến đối tượng mà nó được đính kèm.


2

Đệ quy yêu cầu một cái gì đó để xử lý thông qua việc gọi cùng một quá trình (thường với các tham số khác nhau). Mặc dù bạn thường sử dụng các chức năng và các chức năng đó tự gọi mình, nhưng về mặt kỹ thuật, chúng bước vào một bước mới trông giống như nơi chúng vừa đến.

Tự tham khảo có nghĩa là một cái gì đó đề cập đến chính nó. Các lớp học có thể tự tham chiếu bằng cách sử dụng this, nhưng điều đó không có ý nghĩa đệ quy.


Vì vậy, đệ quy đòi hỏi một quá trình thông qua việc gọi cùng một quy trình, trong khi tự tham chiếu là "cách gọi của chính nó"?
Skullpatrol

@skullpatrol - không. Tự tham khảo không yêu cầu gọi những gì như vậy bao giờ.
Telastyn

Vì vậy, đệ quy đòi hỏi một quá trình thông qua việc gọi cùng một quy trình, trong khi tự tham chiếu là "tham chiếu của chính nó"?
Skullpatrol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.