재귀 알고리즘의 간단한 응용 프로그램

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

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

1, 역순으로 인쇄 문자열

/ ** 
   输入[ "H", "E", "L", "L", "O"] 
   输出[ "O", "L", "L", "E", "H"] 
 * / 
공용 클래스 PrintReverseDemo { 

    공공 정적 무효 메인 (문자열 []에 args) { 
        printReverse ( "애플".toCharArray ()); 
    } 

    개인 정적 무효 printReverse (CHAR [] STR) { 
        헬퍼 (0, STR); 
    } 

    개인 정적 무효 도우미 (INT 지수 숯불 [] STR) { 

        경우 (NULL == STR || 인덱스> = str.length) { 
            리턴; 
        } 
        헬퍼 (인덱스 + 1, STR); 
        System.out.print (STR [인덱스]); 
    } 
}

 

리스트에서 2 개의 노드들 사이의 전환

/ ** 
 *给定1-> 2->应该返回你2-> 3- 4> 1-> 3-> 3. 
 * / 
공용 클래스 SwapNodeDemo { 

    공공 정적 무효 메인 (문자열 []에 args) { 

        ListNode 헤드 makeListNode = (); 

        에서 System.out.println (헤드); 
        에서 System.out.println (swapPairs2 (헤드)); 
} 


    / ** 
     *递归
     * @param 헤드 
     * @return 
     * / 
    공용 static ListNode의 swapPairs (ListNode 헤드) { 
        경우 (헤드 == 널 || head.next == NULL) { 
            창 헤드; 
        } 
        
        ListNode p = head.next; 
        head.next = swapPairs (head.next.next); 
        p.next = 헤드; 
        페이지를 반환; 
    }

    / ** 
     *非递归
     * @param 헤드 
     * @return 
     * / 
    공용 static ListNode swapPairs2 (ListNode 헤드) { 
        ListNode 더미 새로운 ListNode = (-1); 
        dummy.next = 헤드; 
        ListNode CURR = 거짓; 
        반면 (curr.next = NULL && curr.next.next = NULL!) { 
            ListNode 제 = curr.next 단계; 
            ListNode 초 = curr.next.next; 

            // 스왑 두 개의 노드 
            first.next = second.next; 
            second.next = 제; 
            curr.next = 초; 

            // 다음 반복으로 업데이트 
            CURR = curr.next.next; 
        }
        dummy.next 반환;
    } 

    공공 정적 ListNode makeListNode () { 
        ListNode 하나 = 새로운 ListNode (1); 
        ListNode 개의 새로운 ListNode = (2); 
        ListNode 세 = 새로운 ListNode (3); 
        ListNode 네 = 새로운 ListNode (4); 

        one.next = 두; 
        two.next = 세; 
        three.next = 네; 

        하나를 반환; 
    }

 

3, 파스칼의 삼각형

음수가 아닌 정수 감안할 때  numRows의, 의 파스칼의 삼각형 전에 생성  numRows의의  라인을. 파스칼의 삼각형에서 각 번호는 왼쪽 상단과 오른쪽 상단과의 수입니다.

 

공개 목록 <일람> 생성 (INT numRows의) { 
        일람 <일람> 결과 = 새로운 ArrayList를 <> (); 
        (numRows의 <= 0) {경우 
            반환 결과; 
        } 

        에 대해 INT (I = 1; I <= numRows의, 난 ++) { 
            목록 innerList = 새로운 ArrayList를 <> (); 
            대 (INT의 J = 1; J <= I, J ++) { 
                innerList.add (F (I, J)); 
            } 
            result.add (innerList); 
        } 
        반환 결과; 
    } 

    공개 INT의 F (정수 나 정수 J) { 
        (j의 == 1 || I == J) {경우 
            1을 리턴; 
        사용한다} else { 
            복귀 F (I-1, J-1) + F (I-1, J); 
        } 
    }

 

추천

출처www.cnblogs.com/kaleidoscope/p/11407032.html