재단 - 재귀

 재귀 원칙

재귀 재귀 프로세스 문제를 해결하기위한 효과적인 방법, 서브 루틴 호출로서의 기능 자체

당신은 자신의 함수를 호출하는 방법을 생각해 볼 수 있습니다. 트릭은, 재귀 함수는 자신을 호출 할 때마다, 그것은이 하위 문제를 해체 문제에 주어집니다.

아이 재귀 문제가 추가 점없이 해결 될 때까지 재귀 호출을 계속합니다.

무한 루프가 발생하지 않습니다 재귀 함수를 보장하기 위해, 다음과 같은 특성을가집니다 :

  1. 간단한 基本案例(basic case)(또는 일부의 경우는) - 답변을 생성하기 위해 재귀를 사용할 수없는 프로그램을 종료합니다 . --- 종료 조건
  2. 또한 언급 일련의 규칙은, 递推关系(recurrence relation)다른 모든 경우에 기본 케이스로 분할 할 수 있습니다. --- 점화식

함수가 여러 위치에 자신을 호출 할 수 있습니다 있습니다.

 


의 간단한 프로그래밍 문제부터 시작하자 :

역순으로 인쇄 문자열입니다.

당신은 쉽게 문자열의 마지막 문자에서 문자열을 가로 지르는 시작이 문제를 해결하기 위해 반복적 인 접근 방식을 사용할 수 있습니다. 그러나 어떻게 재귀 적으로 그것을 해결하기 위해?

우선, 우리는에 필요한 기능을 정의 할 수 있습니다   첫 번째 문자를 나타내는 문자열을. 그런 다음 우리는 두 단계로 주어진 작업을 수행 할 수 있습니다 :printReverse(str[0...n-1])str[0]

  1. printReverse(str[1...n-1]): 역순으로 인쇄 문자열  str[1...n-1] .
  2. print(str[0]): 문자열의 첫 번째 문자를 인쇄 할 수 있습니다.

우리는 정의에 의해, 첫 번째 단계에서 함수 자체를 호출 참고, 그것은 순환 기능을한다.

예를 들면 :

개인  정적  공극 printReverse ( CHAR는 [] STR) { 
  도우미 ( 0 , STR) 
} 

개인  정적  공극 도우미 ( INT의 지수는 숯불 {[] STR)
   IF (STR ==  || 인덱스> = str.length) {
     반환 ; 
  } 
  // 이 상기 제 1 출력 전류 문자 인덱스 후 인덱스로서 이해 될 수있다 (즉, 지수 + 1) 및 방법은 매크로로 이해 될 수 있으며, 후면 결국 문자 출력, 다음 문자 출력 전류왔다   
  헬퍼 (인덱스 + . (1) , STR) 
  의 System.out.print (STR [인덱스]); 
}

 

재귀 예 :

첫째, 텍스트를 반전

문제 :

함수를 작성, 그 역할은 반전 입력 문자열이다. 문자 배열에 입력 스트링 문자 형태로 지정 []. 
다른 배열에 추가 공간을 할당하지 마십시오, 당신은 O (사용 장소에 입력 배열을 수정해야 하나 이 개 문제를 해결하기 위해 여분의 공간을). 
당신은 배열의 모든 문자가 ASCII 테이블 인쇄 가능한 문자가 있다고 가정 할 수있다.
패키지 com.example.demo; 

공용  클래스 TestString0001 { 

    공개  공극 reverseString ( [] S) {
         INT LEN = s.length; 

        스왑 (S, 0 렌 - 1 ); 
    } 

    개인  공극 스왑 ( 숯불 []들 하는 int 왼쪽 값 int {오른쪽)
         경우 (왼쪽> 오른쪽) {
             리턴 ; 
        } 
         온도는 용 = [좌측] S; 
        S [좌측] =에서 S [오른쪽]; 
        S [오른쪽] =온도; 

        스왑 (들 왼쪽 +1을 오른쪽-1 ); 
    } 

    공공  정적  무효 메인 (문자열 []를 인수) { 

        TestString0001 t = 새로운 TestString0001을 ();
         [] = {도착 'H', 'A', 'N', 'N', 'A', 'H' }; 
        t.reverseString (도착); 
         ( C : 도착) { 
            에서 System.out.println (c); 
        } 
    } 
}

 

둘째, 문제

링크드리스트 내의 노드 스위칭 스물 두 

인접 노드리스트 페어 교환을 부여하고, 과거에리스트를 반환한다. 
당신은 단지 내부 노드 값을 변경할 수 있지만 실제 노드 교환 할 필요가 없습니다.
클래스 솔루션 {
     공공 ListNode의 swapPairs (ListNode 헤드) {
         경우 (머리 == null이 || head.next == null이 ) {
             반환 머리; 
        } 
        ListNode 온도 = 헤드; 
        헤드 = head.next; 
        temp.next = head.next; 
        head.next = 온도; 

        // 下一个交换 
        head.next.next = swapPairs (head.next.next);
        돌아 머리를; 
    } 
}

 

 

 

 

관련 : 재귀에 대한 leetcode :

https://leetcode-cn.com/explore/featured/card/recursion-i/256/principle-of-recursion/1101/

추천

출처www.cnblogs.com/nxzblogs/p/11233304.html