문제

은 무엇 실시-세계 문제는 재귀적인 접근 방식은 자연적인 솔루션외에 깊이 첫 번째 검색(DFS)?

(나는 고려하지 않는다 하노이 타워, 피보나치 번호, 또는 요인을 실제 문제입니다.그들은 약간의 고안해 내 마음에.)

도움이 되었습니까?

해결책

이 많이 있 mathy 예 여기에,하지만 당신이 원 실제 세계 를 들어,그래서 약간의 생각,이것은 아마도 최고가를 제공할 수 있습니다.:

당신을 찾는 사람 계약을 맺어 contageous 감염 아닌 치명적이며,수정을 신속하게 자체(입력)하나를 제외하고,5 명(는 이러한 유형 B)사람이 영구적으로 감염된것으로 보이지 않는 증상과 단 사이의 스프레더입니다.

이 아파의 혼란 때까지 유형 B 감염의 다수를 입력 A.

귀하의 작업을 추적하는 모든 유형 Bs 고를 예방 접종 그들 중의 중추 질환입니다.불행하게도 껀터를 관리하는 전국적인 치료하는 모든기 때문에,사람들은 typeAs 도 치명적인 알레르기 치료를 위해 일하는 입력 B.

방법은 아래와 같이 할 것입니다 것,사회의 발견,주어진 감염된 사람(Type A)모든 선택들이 연락처,지난 주에 표시하는 각 연락처에 힙.테스트할 때 사람이 감염되면,추가할"따라"큐가 있습니다.을 때 사람 입력 B,추가할"따라"머리에서(당신이 원하기 때문에 이것을 막을 빠르다).

후에 가공된 사람을 선택 사람 앞에서 큐의 적용 예방 접종하는 경우 필요합니다.모든 자신의 연락처 이전에 방문하지 않은,그리고 다음을 테스트하는 사람들이 감염될 수 있습니다.

될 때까지 반복 큐의 감염된 사람들은 0 이 되며,다음을 기다리는 또 다른 발생..

(Ok,이 비트가 반복적인,하지만 그는 반복적인 해결 방법으로 재귀적 문제에 이 경우,폭을 먼저 통과 인구의 기본을 발견하려고 노력하고 가능성이 경로를 문제,그리고 게다가,반복적인 솔루션은 종종 빠르고 효과적,그리고 나는 강제적으로 제거하는 재귀 어디서나 그래서 많이 본능적이다.....길!)

다른 팁

실제 예는 재귀

A sunflower

는 방법에 대해 아무것도 포함하는 디렉토리 구조에서의 파일 시스템입니다.재귀적으로 파일 찾기,삭제,파일,디렉터리를 작성,등등.

여기에 자바 구현을 재귀적으로 출력하는 콘텐츠의 디렉토리와 그 하위 디렉터리입니다.

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());
            }
        }       
    }

}

, 병합 정렬, 며,대부분의 다른 N-로그 N 있습니다.

매트한 텍사스의 예은 좋습니다.더 일반적으로,모든 걸리는 일반적으로 처리하여 재귀를 매우 쉽습니다.예를 들어,컴파일을 구문 분석,나무를 걸어 또는 XML,HTML etc.

재귀에서 자주 사용되는 구현 역행 알고리즘.을 위해 실제 응용 프로그램이는 방법에 대 스도쿠 찾기?

재귀는 적절 때마다 문제를 해결할 수 있습으로 나누어 하위 문제가 사용할 수 있는 동에 대한 알고리즘 설계되었습니다.알고리즘에는 나무들과 정렬된 목록은 자연 적합합니다.많은 문제가에서 전산기하학(및 3D 게임)을 해결할 수 있습을 재귀적으로 사용 바이너리 공간 분할 (BSP)나무, 지방분, 또는 기타의 방법으로 나누어 세계로 서브 부분입니다.

재귀는 또한 적절하려고 할 때의 정확성을 보장하는 알고리즘이 있습니다.을 주는 함수 변경할 수 없는 입력 및 결과를 반환합니다 함께 있는 재귀적 및 비재귀에 입력,그것은 일반적으로 증명하기 쉬운 기능은 정확한(또는)사용하여 수학적 유도입니다.그것은 종종 어려운 이렇게하려면으로 반복적인 기능이나 입력할 수 있는 변화시킨다.이 때 유용할 수 있습니다 다루고 재정 계산 및 다른 응용 프로그램 정확성이 매우 중요합니다.

반드시는 많은 컴파일러는 거기에 사용하는 재귀습니다.컴퓨터 프로그래밍 언어의 본질적으로 재귀 자신을(즉,당신은 포함할 수 있습'만약에'내의 문이 다른 경우''진술,etc.).

비활성화/설정을 읽기 전 모든 아이들을 위해 컨트롤에서 컨테이너 제어합니다.필요하기 때문에 이렇게 몇몇 아이들의 컨트롤 컨테이너다.

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);
    }
}

유명한 Eval/적용 주기 SICP

alt text
(출처: mit.edu)

여기에는 정의 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))))

여기에는 정의의 적용합니다:

(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))))

여기에의 정의는 평가-시퀀스:

(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

재귀에서 사용되는 것처럼 BSP trees 충돌 감지를 위해서는 게임 개발(및 다른 유사한 지역).

사람들은 종종 일종의 스택을 사용하여 문서에 재귀적인 방법입니다.예를 들어,당신은 정렬 100 문서에 이름이다.처음으로 문서를 말뚝에 의 첫 번째 문자,그런 종류의 각 더미입니다.

보고는 단어에서 사전 자주에 의해 수행하는 바이너리로 검색과 같은 기술을 재귀적입니다.

에서 조직의 보스를 자주 제공하는 명령 부서,사람에게 명령하여 관리자니다.

파서와 컴파일러에 기록될 수 있습을 재귀-강 방법입니다.지 그것을 할 수있는 가장 좋은 방법은,같은 도구 lex/yacc 생성을 더욱 빠르고 효율적인 구문 분석,하지만 개념적으로 간단하고 구현하기 쉬운,그래서 그들은 일반적입니다.

실제 세계 요구 나는 최근에:

조건:이 기능을 구현한 후 철저하게 이해를 요구 사항 A.

재귀는 문제에 적용(상황에)당신이 그것을 깨고 할 수 있(감소)더 작은 부분으로,그리고 각각의 부분(s)와 비슷한 원래의 문제입니다.

의 좋은 예는 것을 포함하는 작은 부분과 유사한 자체:

  • 트리 구조(지점은 나무처럼)
  • 목록(부품의 목록은 여전히 목록)
  • 컨테이너(러시아 인형)
  • 시퀀스(시퀀스의 일부 같음)
  • 그룹의체(하위 그룹입니다 여전히 그룹의 객체)

재귀 기술을 유지를 깨는 문제로 더 작은 조각으로,때까지 그 조각 중 하나가 될 수 있을 만큼 작은 조각의-케이크입니다.물론 한 후,당신은 휴식을,당신은 다음을"스티치"결과가 다시 함께하는 올바른 순서 형태로 토탈 솔루션을 원래의 문제입니다.

일부 재귀적 정렬 알고리즘,나무가 걷는 알고리즘,지도/을 줄 알고리즘,divide-and-conquer 은 모두 예의 이 기술입니다.

에서 컴퓨터 프로그래밍,대부분의 스택 기반으로 전화-익 유형의 언어는 이미 기능을 내장한 재귀:즉

  • 휴식의 문제가 작은 조각으로==>통화에 자신을 작은 하위 집합의 원본 데이터),
  • 에 대한 추적을 유지하는 방법을 조각 구==>호출 스택,
  • 스티치 결과를 다시==>스택 기반으로 돌아

내가 사용하는 시스템 순수 꼬리 재귀 에서 몇 가지 장소를 시뮬레이션 상태 기계입니다.

몇 가지 좋은 예를 재귀에서 발견됩 프로그래밍 언어입니다.에서 프로그래밍 언어(얼랑, , ML/OCaml/F#,etc.), 그것은 매우 일반적이 목록 처리용 재귀.

을 처리할 때 목록에서 일반적인 긴급 OOP 스타일 언어,그것은 매우 일반적인 표현으로 연결된 목록([item1->item2->item3->item4]).그러나 어떤 프로그래밍 언어,당신은 당신을 찾을 나열하는 스스로이 구현되는 재귀적으로는"머리"의 목록 포인트에서 첫 번째 항목 목록과"꼬리"포인트를 포함하는 목록 항목의 나머지 부분([item1->[item2->[item3->[item4-> []]]]]).그것은 매우 창조적이다.

이의 처리 목록과 결합되었을 때,패턴 매칭은 매우 강력하다.Let's 말하고 싶어 합의 명부 숫자:

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

이것은 본질적으로 말한다면"우리는 불과 함께 빈 목록을 반환 0"(수 있도록 우리가 재귀),다른 사람의 값을 반환드 가치의 합이라고 나머지 품목(따라서,우리의 재귀).

예를 들어,내가 목록 Url, 에,나는 생각하는 분리하는 모든 Url 은 각 URL 링크,그리고 나 줄이는 총 수의 링크에서 모든 Url 을 생성"값을"페이지(접근 구글과 PageRank 그리고 당신을 찾을 수 있습에 정의된 원 MapReduce 종이).이렇게 할 수 있습을 생성할 수 있도록 다국어 사이트를 문서에서도.그리고 많은,많은 다른 많은 것들을 뿐입니다.

을 확장할 수 있습니다 이 기능적인 패턴의 어떤 유형 MapReduce 코드할 수 있는 복의 목록 무언가를,그것을 변형,그리고 돌아가 다른 사람(다른 여부 목록,또는 일부 zip 명령 목록에).

XML 나를 통과하는 아무것도 나무입니다.하지만 정직하게,나는 꽤 많이 사용하지 않을 재귀에서 나의 일이다.

피드백 루프를 계층적인 조직입니다.

상은 최고 경영진으로부터 피드백을 수집하여 모든 사람에서는 회사입니다.

각 행정 모 그/그녀가 직접 보고하고 그들을 알려줍 피드백을 수집합에서 직접 보고합니다.

에 아래 온다.

사람들과 직접적인 보고서--리프 노드 트리에게 자신의 의견을.

피드백 여행 백업무와 각 관리자를 추가하는 그/그녀의 자신의 피드백입니다.

결국 모든 의견은 그것을 다시 정상까지 보스입니다.

이 자연적인 솔루션이기 때문에 재귀적 방법을 필터링 할 수 있습니다 각 단계에서--조합의 중복 제거를 공격의 피드백입니다.톱스 보내는 글로벌 이메일로 각 직원의 보고서는 직접 피드백을 뒤로 그/그녀에게,그러나 거기에는"당신은 진실을 처리할 수 없습니다"그리고"당신은 발사"의 문제,그래서 작품을 재귀를 보장합니다.

당신이 당신을 구축 CMS 웹사이트에 대한 당신의 페이지에서는 나무 구조를 말하는 뿌리는 가정 페이지입니다.

다고 가정한 당신의{user|client|고객이|보}는 요청을 경로에 모든 페이지를 표시 어디에 있는 나무입니다.

특정 페이지 n,당신은 원하는 걸 부모의 n,부모로,그리고,재귀적으로 목록을 작성 노드의 백업 루트의 페이지에 나무입니다.

물론,당신은 당신의 db 여러 시간당 페이지에서 그 예를 들어,그래서 당신이 사용할 수 있습 몇 가지 SQL 싱 보이는 페이지 테이블으로,페이지 테이블을 다시로 b 및 가입니다.id b.부모 그래서 당신은 데이터베이스를 수행합 재귀합니다.그러는 동안,그래서 나의 구문은 아마 도움이되지 않습니다.

다시,당신이 할 수 있습만산 이 한번에 저장된 페이지 레코드만 업데이트로 이동하는 경우 페이지입니다.는 것이 아마 제어하는 것은 매우 효율적입니다.

어쨌든,내$.02

당신이 조직 트리 N 은 깊은 수준입니다.의 여러 가지 노드를 선택하고 확장하려는 경우에만 해당 노드는 것이 확인되었다.

이것은 내가 실제로는 코드입니다.적으로 재귀.

내 작업에서 우리가 시스템의 일반 데이터 구조로 설명 될 수있다.......즉,재귀는 매우 효과적인 기술은 데이터와 함께 작동합니다.

그것을 해결하지 않고 재귀 것이 많이 필요 불필요한 코드.문제와 재귀는 그것이 쉽지 않을 따라 발생합니다.당신이 정말로 집중해야 할 때 다음의 흐름을 실행합니다.그러나 그것이 작동할 때는 코드는 우아하고 효과적입니다.

계산한 금융/물리학 등 화합물을 평균.

  • 구문 분석 XML 파일입니다.
  • 효율적인 검색에 다차원 공간이 있습니다.Eg.쿼드-나무에서 제 2,oct-나무에서 3D,kd-나무,등등.
  • Hierarchical clustering.
  • 그것의 생각을 통과,어떤 계층적 구조는 자연스럽게 자체적을 재귀.
  • 템플릿과 메타 프로그래밍에서는 C++,이 없을 루프 및 재귀는 유일한 방법입니다.

구문 분석의 나무에서 컨트롤 Windows Forms 또 WebForms(.NET Windows Forms/ ASP.NET).

최를 들어 내가 알고 있는 ,그것은 훨씬 더 간단과 재귀.을 살펴:

shop.oreilly.com/product/9780596510046.do

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

(클릭 첫번째 자막에서 제 3 장:"가장 아름다운 코드 내가 쓴").

전화 및 케이블 기업을 유지하의 모델들이 결선 토폴로지에 효과가 큰 네트워크 또는 그래프입니다.재귀는 방법 중 하나를 통과 이 모델을 찾으려는 경우 모든 부모 또는 모두 자녀가 요소입니다.

이후 재귀는 비싼에서 처리 및 메모리의 관점,이 단계는 일반적으로만 수행된 경우 토폴로지를 변경하고 그 결과에 저장되는 수정 사전 주문 목록 형식이다.

유도 추론,프로세스의 개념을 형성,재귀적 자연에 있습니다.의 두뇌는 그것의 모든 시간,현실 세계에서.

전과 같이 의견에 대한 컴파일러입니다.추상적인 구문을 나무를 자연스럽게 자신을 빌려 재귀.모든 재귀적 데이터 구조(링크 목록,트리,그래프 등) 또한 더 쉽게 처리과 재귀.내가 생각하는 대부분의 우리를 얻지 않을 재귀를 사용하는 많은 일단 우리가 때문에 학교의 유형을 실제 문제이지만,그것의 좋은 그것을 알고 있어야하는 옵션입니다.

의 곱셈 자연수는 실제 예는 재귀:

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top