재귀 원칙
재귀 재귀 프로세스 문제를 해결하기위한 효과적인 방법, 서브 루틴 호출로서의 기능 자체
당신은 자신의 함수를 호출하는 방법을 생각해 볼 수 있습니다. 트릭은, 재귀 함수는 자신을 호출 할 때마다, 그것은이 하위 문제를 해체 문제에 주어집니다.
아이 재귀 문제가 추가 점없이 해결 될 때까지 재귀 호출을 계속합니다.
무한 루프가 발생하지 않습니다 재귀 함수를 보장하기 위해, 다음과 같은 특성을가집니다 :
- 간단한
基本案例(basic case)
(또는 일부의 경우는) - 답변을 생성하기 위해 재귀를 사용할 수없는 프로그램을 종료합니다 . --- 종료 조건 - 또한 언급 일련의 규칙은,
递推关系(recurrence relation)
다른 모든 경우에 기본 케이스로 분할 할 수 있습니다. --- 점화식
함수가 여러 위치에 자신을 호출 할 수 있습니다 있습니다.
예
의 간단한 프로그래밍 문제부터 시작하자 :
역순으로 인쇄 문자열입니다.
당신은 쉽게 문자열의 마지막 문자에서 문자열을 가로 지르는 시작이 문제를 해결하기 위해 반복적 인 접근 방식을 사용할 수 있습니다. 그러나 어떻게 재귀 적으로 그것을 해결하기 위해?
우선, 우리는에 필요한 기능을 정의 할 수 있습니다 첫 번째 문자를 나타내는 문자열을. 그런 다음 우리는 두 단계로 주어진 작업을 수행 할 수 있습니다 :printReverse(str[0...n-1])
str[0]
printReverse(str[1...n-1])
: 역순으로 인쇄 문자열str[1...n-1]
.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/