Ví dụ trong thế giới thực về đệ quy [đã đóng]


97

Các vấn đề trong thế giới thực khi phương pháp tiếp cận đệ quy là giải pháp tự nhiên bên cạnh tìm kiếm theo chiều sâu (DFS) là gì?

(Tôi không coi Tower of Hanoi , số Fibonacci hay các vấn đề trong thế giới thực giai thừa. Chúng có một chút suy nghĩ trong đầu tôi.)


2
Cảm ơn vì tất cả các đề xuất nhưng tất cả mọi người đều đề xuất đường truyền cây / mạng. Các luận văn về cơ bản là tất cả các ví dụ về Tìm kiếm Thứ nhất (hoặc BFS tôi đoán). Tôi đang tìm kiếm các thuật toán / vấn đề có động cơ tốt khác.
redfood 19-08

10
Tôi thích câu hỏi này! "Nói cho tôi biết tất cả những ứng dụng của kỹ thuật X, ngoại trừ việc sử dụng thực tế chính của kỹ thuật X"
Justin Standard

1
Tôi sử dụng đệ quy mọi lúc, nhưng thường cho những thứ mathy và graphy. Tôi đang cố gắng tìm kiếm các ví dụ về đệ quy sẽ có ý nghĩa đối với những người không phải là lập trình viên.
redfood 23/09/08

6
Chọn tiểu thuyết phiêu lưu của riêng bạn! Tôi muốn đọc toàn bộ, và đệ quy là cách tốt nhất để làm như vậy.
Andres

Không có đệ quy trong thế giới thực. Đệ quy là một trừu tượng toán học. Bạn có thể mô hình hóa rất nhiều thứ bằng cách sử dụng đệ quy. Theo nghĩa đó, Fibonacci hoàn toàn là trong thế giới thực, vì có khá nhiều vấn đề trong thế giới thực có thể được mô hình hóa theo cách này. Nếu bạn nghĩ rằng Fibonacci không phải là thế giới thực, thì tôi sẽ khẳng định rằng tất cả các ví dụ khác cũng là những ví dụ trừu tượng, không phải ví dụ trong thế giới thực.
Zane

Câu trả lời:


41

Có rất nhiều ví dụ nhỏ ở đây, nhưng bạn muốn có một ví dụ trong thế giới thực , vì vậy với một chút suy nghĩ, đây có thể là điều tốt nhất mà tôi có thể đưa ra:

Bạn tìm thấy một người đã mắc một bệnh truyền nhiễm nhất định, không gây tử vong và tự khắc phục nhanh chóng (Loại A), Ngoại trừ 1/5 người (Chúng tôi sẽ gọi là loại B) bị nhiễm vĩnh viễn và không có biểu hiện triệu chứng và chỉ hoạt động một kẻ lây lan.

Điều này tạo ra làn sóng tàn phá khá khó chịu khi loại B lây nhiễm cho vô số loại A.

Nhiệm vụ của bạn là theo dõi tất cả các loại B và chủng ngừa chúng để ngăn chặn mầm mống của dịch bệnh. Thật không may, bạn không thể quản lý một phương pháp chữa trị trên toàn quốc cho tất cả mọi người, bởi vì những người thuộc tuýp A cũng dễ bị dị ứng với phương pháp chữa trị phù hợp với loại B.

Cách bạn sẽ làm điều này, sẽ là khám phá xã hội, cho một người bị nhiễm (Loại A), chọn tất cả các liên hệ của họ trong tuần trước, đánh dấu từng liên hệ trên một đống. Khi bạn kiểm tra một người bị nhiễm bệnh, hãy thêm họ vào hàng đợi "theo dõi". Khi một người thuộc loại B, hãy thêm họ vào phần "theo dõi" ở đầu (vì bạn muốn dừng việc này nhanh chóng).

Sau khi xử lý một người nhất định, hãy chọn người đó từ phía trước của hàng đợi và áp dụng chủng ngừa nếu cần. Lấy tất cả các địa chỉ liên hệ của họ trước đó không được truy cập và sau đó kiểm tra xem họ có bị nhiễm hay không.

Lặp lại cho đến khi hàng đợi của những người bị nhiễm trở thành 0, sau đó đợi một đợt bùng phát khác ..

(Ok, đây là cách lặp đi lặp lại một chút, nhưng nó là cách lặp đi lặp lại để giải quyết vấn đề đệ quy, trong trường hợp này, truyền tải đầu tiên theo chiều rộng của cơ sở tổng hợp cố gắng khám phá các đường dẫn có khả năng dẫn đến vấn đề và bên cạnh đó, các giải pháp lặp lại thường nhanh hơn và hiệu quả hơn , và tôi bắt buộc loại bỏ đệ quy ở khắp mọi nơi đến nỗi nó trở thành bản năng. .... chết tiệt!)


2
Cảm ơn - đây vẫn là biểu đồ truyền tải nhưng nó có động lực tốt và có ý nghĩa đối với những người không phải lập trình viên.
redfood 23/09/08

Tôi tin rằng việc tìm kiếm bệnh nhân 0 sẽ là một ví dụ tốt hơn. Xác định tất cả các tương tác có thể gây ra nhiễm trùng. Lặp lại trên tất cả tham gia những người truyền nhiễm tại thời điểm sự tương tác cho đến khi không truyền nhiễm được tìm thấy
William Fitzpatrick

4
ví dụ trong thế giới thực này bây giờ cảm thấy rất quen thuộc :(
haroldolivieri

109

Một ví dụ thực tế về đệ quy

Hoa hướng dương


12
được mã hóa bằng đệ quy bởi kiến ​​trúc sư Ma trận :)
Marcel

3
Làm thế nào là đệ quy này? Chắc chắn, nó đẹp. Nhưng đệ quy? Một cây bắp cải fractal có thể hoạt động tốt, nhưng tôi không thấy những điểm tương đồng ở loài hoa này.
Clément

1
Chà, hơi đau ở má, nhưng đó là một ví dụ về phyllotaxis, có thể được mô tả bằng chuỗi Fibonacci, thường được thực hiện thông qua đệ quy.
Hans Sjunnesson

1
"thường được thực hiện thông qua đệ quy" không nhất thiết có nghĩa là hoa làm như vậy. Có lẽ nó không; Tôi không đủ là một nhà sinh học phân tử để biết, nhưng không có lời giải thích về cách nó hoạt động, tôi không thấy điều này đặc biệt hữu ích. Phản đối. Nếu bạn muốn thêm một mô tả (cho dù nó có chính xác về mặt sinh học hay không, nó có thể giúp bạn hiểu rõ hơn) để đi kèm với nó, tôi sẽ vui vẻ xem xét lại phiếu bầu.
lindes

65

Làm thế nào về bất cứ điều gì liên quan đến cấu trúc thư mục trong hệ thống tệp. Tìm kiếm đệ quy tệp, xóa tệp, tạo thư mục, v.v.

Đây là một triển khai Java in ra một cách đệ quy nội dung của một thư mục và các thư mục con của nó.

import java.io.File;

public class DirectoryContentAnalyserOne implements DirectoryContentAnalyser {

    private static StringBuilder indentation = new StringBuilder();

    public static void main (String args [] ){
        // Here you pass the path to the directory to be scanned
        getDirectoryContent("C:\\DirOne\\DirTwo\\AndSoOn");
    }

    private static void getDirectoryContent(String filePath) {

        File currentDirOrFile = new File(filePath);

        if ( !currentDirOrFile.exists() ){
            return;
        }
        else if ( currentDirOrFile.isFile() ){
            System.out.println(indentation + currentDirOrFile.getName());
            return;
        }
        else{
            System.out.println("\n" + indentation + "|_" +currentDirOrFile.getName());
            indentation.append("   ");

            for ( String currentFileOrDirName : currentDirOrFile.list()){
                getPrivateDirectoryContent(currentDirOrFile + "\\" + currentFileOrDirName);
            }

            if (indentation.length() - 3 > 3 ){
                indentation.delete(indentation.length() - 3, indentation.length());
            }
        }       
    }

}

2
Hệ thống tệp cung cấp động lực (tốt, cảm ơn) nhưng đây là một ví dụ cụ thể về DFS.
redfood 19-08

4
Tôi không hiểu từ viết tắt "DFS" - đã lâu rồi tôi không ngồi trong lớp học.
Matt Dillard 19-08

5
tìm kiếm theo chiều sâu: dfs (node) {foreach con trong node {visit (con); }}
Haoest

Đối với ví dụ về mã đơn giản, hãy xem ví dụ: stackoverflow.com/questions/126756/…
Jonik

Có lỗi trong mã này không? Không nên thay thế getPrivateDirectoryContent () bằng getDirectoryContent ()?
Shn_Android_Dev


16

Ví dụ của Matt Dillard là tốt. Nói chung, mọi bước đi của cây nói chung có thể được xử lý bằng đệ quy rất dễ dàng. Ví dụ: biên dịch cây phân tích cú pháp, xem qua XML hoặc HTML, v.v.


Tôi thấy câu trả lời "biên dịch cây phân tích cú pháp" này là một câu trả lời hợp lý, liên quan đến cây cối nhưng vẫn không phải là vấn đề tìm kiếm, như mong muốn của người hỏi. Nó có thể được khái quát thành một số khái niệm chung về việc biên dịch hoặc giải thích một ngôn ngữ. Nó cũng có thể là "thông dịch" (hiểu, nghe) một ngôn ngữ tự nhiên, chẳng hạn như tiếng Anh.
imz - Ivan Zakharyaschev

16

Đệ quy thường được sử dụng trong việc triển khai thuật toán Backtracking . Đối với một ứng dụng "thế giới thực" của điều này, làm thế nào về một người giải Sudoku ?


Một mảng trạng thái và một mức thấp có thể tăng tốc độ này.
BCS

13

Đệ quy thích hợp bất cứ khi nào một vấn đề có thể được giải quyết bằng cách chia nó thành các bài toán con, có thể sử dụng cùng một thuật toán để giải chúng. Các thuật toán trên cây và danh sách được sắp xếp là một sự phù hợp tự nhiên. Nhiều vấn đề trong hình học tính toán (và trò chơi 3D) có thể được giải một cách đệ quy bằng cách sử dụng cây phân vùng không gian nhị phân (BSP), các phân khu béo hoặc các cách khác để chia thế giới thành các phần con.

Đệ quy cũng thích hợp khi bạn đang cố gắng đảm bảo tính đúng đắn của một thuật toán. Cho một hàm nhận các đầu vào không thay đổi và trả về kết quả là sự kết hợp của các lệnh gọi đệ quy và không đệ quy trên các đầu vào, thường dễ dàng chứng minh hàm là đúng (hoặc không) bằng cách sử dụng quy nạp toán học. Thường khó thực hiện điều này với một hàm lặp lại hoặc với các đầu vào có thể thay đổi. Điều này có thể hữu ích khi xử lý các tính toán tài chính và các ứng dụng khác mà tính đúng đắn là rất quan trọng.


11

Chắc chắn rằng nhiều trình biên dịch ngoài kia sử dụng đệ quy rất nhiều. Các ngôn ngữ máy tính vốn có tính đệ quy (tức là bạn có thể nhúng các câu lệnh 'if' vào bên trong các câu lệnh 'if' khác, v.v.).


Nhúng câu lệnh if không phải là đệ quy.
John Meagher 19-08

Nhưng phân tích cú pháp chúng đòi hỏi đệ quy, John.
Apocalisp

2
John, thực tế là bạn có thể lồng các câu lệnh if có nghĩa là định nghĩa ngôn ngữ (và có thể là trình phân tích cú pháp ngôn ngữ) là đệ quy.
Công viên Derek

Gốc đệ quy là một trong những cách dễ dàng nhất để viết mã trình biên dịch. Không dễ dàng như sử dụng một công cụ như yacc, nhưng dễ hiểu hơn về cách nó hoạt động. Toàn bộ máy trạng thái hướng bảng có thể được giải thích, nhưng thường kết thúc là hộp đen.
Nhật thực

Câu trả lời của Cody Brocious đề cập đến "biên dịch cây phân tích cú pháp" cũng chỉ ra lĩnh vực này: phân tích / giải thích / biên dịch ngôn ngữ.
imz - Ivan Zakharyaschev

9

Tắt / đặt chế độ chỉ đọc cho tất cả các điều khiển dành cho trẻ em trong điều khiển vùng chứa. Tôi cần phải làm điều này vì một số điều khiển trẻ em chính là thùng chứa.

public static void SetReadOnly(Control ctrl, bool readOnly)
{
    //set the control read only
    SetControlReadOnly(ctrl, readOnly);

    if (ctrl.Controls != null && ctrl.Controls.Count > 0)
    {
        //recursively loop through all child controls
        foreach (Control c in ctrl.Controls)
            SetReadOnly(c, readOnly);
    }
}

8

Chu trình Đánh giá / Áp dụng nổi tiếng từ SICP

văn bản thay thế
(nguồn: mit.edu )

Đây là định nghĩa của eval:

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ((variable? exp) (lookup-variable-value exp env))
        ((quoted? exp) (text-of-quotation exp))
        ((assignment? exp) (eval-assignment exp env))
        ((definition? exp) (eval-definition exp env))
        ((if? exp) (eval-if exp env))
        ((lambda? exp)
         (make-procedure (lambda-parameters exp)
                         (lambda-body exp)
                         env))
        ((begin? exp) 
         (eval-sequence (begin-actions exp) env))
        ((cond? exp) (eval (cond->if exp) env))
        ((application? exp)
         (apply (eval (operator exp) env)
                (list-of-values (operands exp) env)))
        (else
         (error "Unknown expression type - EVAL" exp))))

Đây là định nghĩa của apply:

(define (apply procedure arguments)
  (cond ((primitive-procedure? procedure)
         (apply-primitive-procedure procedure arguments))
        ((compound-procedure? procedure)
         (eval-sequence
           (procedure-body procedure)
           (extend-environment
             (procedure-parameters procedure)
             arguments
             (procedure-environment procedure))))
        (else
         (error
          "Unknown procedure type - APPLY" procedure))))

Đây là định nghĩa của eval-sequence:

(define (eval-sequence exps env)
  (cond ((last-exp? exps) (eval (first-exp exps) env))
        (else (eval (first-exp exps) env)
              (eval-sequence (rest-exps exps) env))))

eval-> apply-> eval-sequence->eval


7

Đệ quy được sử dụng trong những thứ như cây BSP để phát hiện va chạm trong phát triển trò chơi (và các lĩnh vực tương tự khác).


7

Mọi người thường sắp xếp chồng tài liệu bằng phương pháp đệ quy. Ví dụ, hãy tưởng tượng bạn đang sắp xếp 100 tài liệu có tên trên chúng. Đầu tiên hãy xếp các tài liệu thành từng chồng theo chữ cái đầu tiên, sau đó sắp xếp từng chồng.

Việc tra cứu các từ trong từ điển thường được thực hiện bằng một kỹ thuật giống như tìm kiếm nhị phân, là kỹ thuật đệ quy.

Trong các tổ chức, sếp thường ra lệnh cho các trưởng bộ phận, người này lần lượt ra lệnh cho người quản lý, v.v.


5

Yêu cầu thế giới thực mà tôi nhận được gần đây:

Yêu cầu A: Triển khai tính năng này sau khi hiểu kỹ Yêu cầu A.


4

Các trình phân tích cú pháp và trình biên dịch có thể được viết theo phương thức đệ quy xuống gốc. Không phải là cách tốt nhất để làm điều đó, vì các công cụ như lex / yacc tạo ra các trình phân tích cú pháp nhanh hơn và hiệu quả hơn, nhưng về mặt khái niệm đơn giản và dễ thực hiện, vì vậy chúng vẫn phổ biến.


4

Đệ quy được áp dụng cho các vấn đề (tình huống) trong đó bạn có thể chia nhỏ (giảm nó) thành các phần nhỏ hơn và mỗi (các) phần trông tương tự như vấn đề ban đầu.

Ví dụ tốt về nơi những thứ có chứa các phần nhỏ hơn tương tự như chính nó là:

  • cấu trúc cây (một nhánh giống như một cái cây)
  • danh sách (một phần của danh sách vẫn là danh sách)
  • thùng chứa (búp bê Nga)
  • chuỗi (một phần của chuỗi trông giống như phần tiếp theo)
  • nhóm đối tượng (nhóm con vẫn là một nhóm đối tượng)

Đệ quy là một kỹ thuật để tiếp tục chia vấn đề thành các phần nhỏ hơn và nhỏ hơn, cho đến khi một trong những phần đó trở nên đủ nhỏ để trở thành một miếng bánh. Tất nhiên, sau khi bạn chia nhỏ chúng, bạn phải "ghép" các kết quả lại với nhau theo đúng thứ tự để tạo thành một giải pháp tổng thể cho vấn đề ban đầu của bạn.

Một số thuật toán sắp xếp đệ quy, thuật toán đi bộ trên cây, thuật toán ánh xạ / thu nhỏ, chia và chinh phục đều là những ví dụ của kỹ thuật này.

Trong lập trình máy tính, hầu hết các ngôn ngữ kiểu gọi trả lại dựa trên ngăn xếp đã có sẵn các khả năng cho phép đệ quy: tức là

  • chia nhỏ vấn đề thành các phần nhỏ hơn ==> tự gọi nó trên một tập con nhỏ hơn của dữ liệu gốc),
  • theo dõi cách các phần được chia ==> gọi ngăn xếp,
  • ghép các kết quả lại ==> trả về dựa trên ngăn xếp


4

Một số ví dụ tuyệt vời về đệ quy được tìm thấy trong các ngôn ngữ lập trình hàm . Trong các ngôn ngữ lập trình chức năng ( Erlang , Haskell , ML / OCaml / F # , v.v.), việc sử dụng đệ quy xử lý danh sách là rất phổ biến.

Khi xử lý danh sách bằng các ngôn ngữ kiểu OOP mệnh lệnh điển hình, bạn rất thường thấy danh sách được triển khai dưới dạng danh sách được liên kết ([item1 -> item2 -> item3 -> item4]). Tuy nhiên, trong một số ngôn ngữ lập trình chức năng, bạn thấy rằng bản thân danh sách được triển khai đệ quy, trong đó "phần đầu" của danh sách trỏ đến mục đầu tiên trong danh sách và "đuôi" trỏ đến danh sách chứa phần còn lại của các mục ( [item1 -> [item2 -> [item3 -> [item4 -> []]]]]). Nó khá sáng tạo theo ý kiến ​​của tôi.

Việc xử lý danh sách này, khi được kết hợp với đối sánh mẫu, rất mạnh mẽ. Giả sử tôi muốn tính tổng một danh sách các số:

let rec Sum numbers =
    match numbers with
    | [] -> 0
    | head::tail -> head + Sum tail

Điều này về cơ bản nói rằng "nếu chúng tôi được gọi với một danh sách trống, hãy trả về 0" (cho phép chúng tôi phá vỡ đệ quy), nếu không trả về giá trị của head + giá trị của Sum được gọi với các mục còn lại (do đó, đệ quy của chúng tôi).

Ví dụ: tôi có thể có một danh sách các URL , tôi nghĩ rằng hãy tách tất cả các URL mà mỗi URL liên kết đến, sau đó tôi giảm tổng số liên kết đến / từ tất cả các URL để tạo "giá trị" cho một trang (một cách tiếp cận mà Google với PageRank và bạn có thể tìm thấy định nghĩa trong tài liệu MapReduce gốc ). Bạn cũng có thể làm điều này để tạo số lượng từ trong tài liệu. Và nhiều, nhiều, nhiều thứ khác nữa.

Bạn có thể mở rộng mẫu chức năng này cho bất kỳ loại mã MapReduce nào mà bạn có thể lấy danh sách một thứ gì đó, chuyển đổi nó và trả lại một thứ khác (cho dù là một danh sách khác hay một số lệnh zip trên danh sách).


3

XML, hoặc duyệt qua bất kỳ thứ gì là cây. Mặc dù, thành thật mà nói, tôi hầu như không bao giờ sử dụng đệ quy trong công việc của mình.


Thậm chí không phải đệ quy đuôi?
Apocalisp

Tôi đã sử dụng đệ quy một lần trong sự nghiệp của mình và khi khuôn khổ thay đổi, tôi đã loại bỏ nó. 80% những gì chúng tôi làm là CRUD.
Charles Graham 20-08

1
Đề cập đến "XML" ngay từ đầu khá lạ. Đó không phải là một điều tự nhiên, không phải là điều mà một người bình thường mà bạn sẽ dạy phải đối mặt trong cuộc sống hàng ngày. Nhưng ý tưởng tất nhiên là khá hợp lý.
imz - Ivan Zakharyaschev

3

Các vòng lặp phản hồi trong một tổ chức phân cấp.

Sếp cao nhất yêu cầu các giám đốc điều hành hàng đầu thu thập phản hồi từ mọi người trong công ty.

Mỗi giám đốc điều hành thu thập các báo cáo trực tiếp của mình và yêu cầu họ thu thập phản hồi từ các báo cáo trực tiếp của họ.

Và trên dòng.

Những người không có báo cáo trực tiếp - các nút lá trên cây - đưa ra phản hồi của họ.

Phản hồi sẽ đi ngược lại cây với mỗi người quản lý thêm phản hồi của riêng mình.

Cuối cùng, tất cả các phản hồi đều được gửi đến sếp cao nhất.

Đây là giải pháp tự nhiên vì phương pháp đệ quy cho phép lọc ở mỗi cấp độ - đối chiếu các bản sao và loại bỏ các phản hồi gây khó chịu. Sếp cao nhất có thể gửi một email toàn cầu và yêu cầu từng nhân viên báo cáo phản hồi trực tiếp lại cho anh ấy / cô ấy, nhưng có những vấn đề "bạn không thể giải quyết sự thật" và "bạn bị sa thải", vì vậy đệ quy hoạt động tốt nhất ở đây.


2

Giả sử bạn đang xây dựng CMS cho một trang web, trong đó các trang của bạn nằm trong cấu trúc cây, giả sử gốc là trang chủ.

Cũng giả sử {người dùng | khách hàng | khách hàng | ông chủ} của bạn yêu cầu bạn đặt một đường dẫn đường dẫn trên mỗi trang để hiển thị bạn đang ở đâu.

Đối với bất kỳ trang nào cho trước n, bạn có thể muốn đi đến trang cha của n và cha của nó, v.v., một cách đệ quy để xây dựng một danh sách các nút sao lưu vào gốc của cây trang.

Tất nhiên, bạn đang nhấn db vài lần cho mỗi trang trong ví dụ đó, vì vậy bạn có thể muốn sử dụng một số bí danh SQL nơi bạn tra cứu bảng trang dưới dạng a, và bảng trang lại là b và tham gia a.id với b.parent để bạn tạo cơ sở dữ liệu thực hiện các phép nối đệ quy. Đã lâu rồi, vì vậy cú pháp của tôi có lẽ không hữu ích.

Sau đó, một lần nữa, bạn có thể chỉ muốn tính toán điều này một lần và lưu trữ nó với bản ghi trang, chỉ cập nhật nó nếu bạn di chuyển trang. Điều đó có lẽ sẽ hiệu quả hơn.

Dù sao, đó là $ 0,02 của tôi


2

Bạn có một cây tổ chức sâu N cấp. Một số nút đã được kiểm tra và bạn muốn mở rộng chỉ những nút đã được kiểm tra.

Đây là thứ mà tôi thực sự đã viết mã. Tốt và dễ dàng với đệ quy.


2

Trong công việc của tôi, chúng tôi có một hệ thống với cấu trúc dữ liệu chung có thể được mô tả như một cây. Điều đó có nghĩa là đệ quy là một kỹ thuật rất hiệu quả để làm việc với dữ liệu.

Giải quyết nó mà không cần đệ quy sẽ yêu cầu rất nhiều mã không cần thiết. Vấn đề với đệ quy là không dễ theo dõi những gì xảy ra. Bạn thực sự phải tập trung khi theo dõi quá trình thực hiện. Nhưng khi nó hoạt động, mã rất thanh lịch và hiệu quả.


2

Tính toán cho tài chính / vật lý, chẳng hạn như trung bình kép.


2
  • Phân tích cú pháp một XML .
  • Tìm kiếm hiệu quả trong không gian đa chiều. Ví dụ. cây bốn trong 2D, cây bát phân trong 3D, cây kd, v.v.
  • Phân cụm phân cấp.
  • Hãy nghĩ về nó, đi ngang qua bất kỳ cấu trúc phân cấp nào cũng tự nhiên cho phép nó trở thành đệ quy.
  • Lập trình siêu mẫu trong C ++, nơi không có vòng lặp và đệ quy là cách duy nhất.

"XML" không cần thiết cho ý tưởng của câu trả lời này (và việc đề cập cụ thể đến XML có thể khiến những người bạn đang giảng dạy kinh tởm / nhàm chán). Chỉ cần bất kỳ ngôn ngữ điển hình nào (ngôn ngữ máy tính hoặc ngôn ngữ tự nhiên) sẽ là ví dụ cho vấn đề phân tích cú pháp đệ quy.
imz - Ivan Zakharyaschev

Người đăng đã hỏi về "các vấn đề trong thế giới thực mà cách tiếp cận đệ quy là giải pháp tự nhiên". Phân tích cú pháp một tệp xml chắc chắn là một vấn đề trong thế giới thực và nó tự nhiên cho phép mình thực hiện đệ quy. Việc bạn có vẻ ác cảm lạ lùng với XML không làm thay đổi thực tế là nó được sử dụng rất rộng rãi.
Dima


2

Ví dụ tốt nhất mà tôi biết là quicksort , nó đơn giản hơn rất nhiều với đệ quy. Hãy xem:

shop.oreilly.com/product/9780596510046.do

www.amazon.com/Beautiful-Code-Leading-Programmers-Practice/dp/0596510047

(Bấm vào phụ đề đầu tiên dưới chương 3: "Đoạn mã đẹp nhất mà tôi từng viết").


1
Và MergeSort, cũng đơn giản hơn với đệ quy.
Matthew Schinckel 20/09/08

1
Liên kết bị hỏng. Bạn có thể thêm tên sách?
Peter Mortensen

@PeterMortensen, cuốn sách Beautiful Code của Greg Wilson và Andy Oram. Tôi đã cập nhật liên kết, mặc dù có vẻ như O'Reilly không cho phép nhìn vào bên trong nữa. Nhưng bạn có thể xem qua Amazon.
Fabio Ceconello

1

Các công ty điện thoại và cáp duy trì một mô hình cấu trúc liên kết dây của họ, thực chất là một mạng hoặc đồ thị lớn. Đệ quy là một cách để duyệt qua mô hình này khi bạn muốn tìm tất cả các phần tử cha hoặc tất cả các phần tử con.

Vì đệ quy tốn kém từ góc độ xử lý và bộ nhớ, bước này thường chỉ được thực hiện khi cấu trúc liên kết được thay đổi và kết quả được lưu trữ ở định dạng danh sách được sắp xếp trước đã sửa đổi.


1

Suy luận quy nạp, quá trình hình thành khái niệm, có bản chất là đệ quy. Bộ não của bạn làm việc đó mọi lúc, trong thế giới thực.


1

Ditto nhận xét về trình biên dịch. Các nút cây cú pháp trừu tượng tự nhiên cho phép mình đệ quy. Tất cả các cấu trúc dữ liệu đệ quy (danh sách liên kết, cây, đồ thị, v.v.) cũng được xử lý dễ dàng hơn với đệ quy. Tôi nghĩ rằng hầu hết chúng ta không sử dụng đệ quy nhiều khi chúng ta đã rời trường học vì các loại vấn đề trong thế giới thực, nhưng thật tốt nếu nhận thức được nó như một lựa chọn.


1

Phép nhân các số tự nhiên là một ví dụ trong thế giới thực của phép đệ quy:

To multiply x by y
  if x is 0
    the answer is 0
  if x is 1
    the answer is y
  otherwise
    multiply x - 1 by y, and add x
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.