어떻게 귀속을 이해하고, 귀속을 생각하고, 운용할 것인가

귀속: 우선 창고의 지식을 알아야 한다.'후진선출'귀속은 프로그램이 특정한 지점에 실행될 때 자신을 호출한다. 이때 이전에 실행되지 않은 프로그램은 잠시 실행되지 않고 다음 층에서 실행이 끝난 후에 실행된다.이것이 바로 창고에 부합되는 선진적인 후출이다.이럴 때 창고에 들어갈 사람이 있습니다. 다음 층에서 호출이 끝나면 창고를 나가서 계속 운행할 수 있습니다.그 다음에 귀환을 운용하는 데 필요한 두 가지 조건을 알아야 한다. 첫째, 경계가 있어야 한다. 즉, 수출 둘째, 추이 관계가 있어야 한다. 마지막으로 귀환을 사용하는 요령을 기억해야 한다. A 함수를 이용하여 기능을 실현할 때 A 함수체는 같은 기능을 사용해야 한다. 이럴 때 귀환의 윗부분을 사용해야 한다. 아래의 예를 이용하여 귀환을 어떻게 사용하는지, 언제 귀환을 사용하는지 알 수 있다!Go!


예를 들면 다음과 같습니다.

예1.strlen 귀속 해법은 먼저 추이 관계를 찾아라:char*s="abcdefg"를 원한다면 strlen(s):단계 1:strlen("bcdefg")을 구하라. 즉strlen(s+1)단계 2:단계 1의 결과를 1로 되돌려 주면 된다-------------이것이 추이 관계다. s의 길이를 구하려면 s+1의 길이를 구해야 한다!!!그럼 경계 조건은:char*s=NULL 또는char*s='\0'일 때 직접 결과를 얻고 계속 귀속할 필요가 없다. 이것이 바로 경계 조건을 분석한 다음에 코드가 자연히 나온다.

int strlen(const char * s)
{
         // 
          if(NULL==s)          
                    return -1;          
          else if('\0'==*s)
                     return 0;
          //  
          else 
                     return (strlen(s+1)+1);
}

예2: 반복 문자열 역순


예를 들어 s="abcdef", 역순 후 "fedcba"로 바뀌면 먼저 추이 관계를 찾는다. 역순 abcdef: 단계 1: a와 f를 교환하려면 단계 2: bcde에 대해 역순 ------------(같은 기능이 필요하기 때문에 반드시 추이를 사용해야 한다)--------------------------------이것이 바로 추이 관계, 역순 "abcdef", 역순 "bcde"가 필요하다!!더 나아가 알 수 있듯이, 이 귀속 함수는 매개 변수의 상표와 하표의 경계 조건을 입력해야 합니까?s안에 문자가 없으면 NULL이 되는 상황에서 정렬하지 않아도 되고 s안에 원소가 하나만 있을 때 정렬하지 않아도 된다. 이것이 바로 경계 조건을 분석한 것이다. 코드가 자연히 나온다.
char * Reverse_Str(char *s, int first ,int last)
{
        // : 
        if(last<=first)
                   return s;
        else
          {
                       // 
                       char temp=s[first];
                       s[first]=s[last];
                       s[last]=temp;
                      // 
                       Reverse_Str(s,first+1,last+1);  // , first++, last--, , !
                        
          }
}

예3.한노타 문제


 
먼저 추이 관계를 찾다.
n개의 접시를 원한다면 A에 놓고 B를 이용해서 C:
1단계: A의 맨 위 n-1개의 접시를 C를 통과해 B에 놓는다
2단계: A의 맨 위에 있는 접시를 B를 통해 C에 놓는다
3단계: B에 있는 n-1개의 접시를 A를 통해 C에 넣는다
------------이것이 바로 점차적 관계입니다. 함수의 기능은 A의 접시를 B를 통해 C에 놓는 것입니다. 우리가 이동하는 모든 단계는 같은 기능이 필요합니다.함수의 매개 변수는 A, B, C가 있어야 한다는 것을 한층 더 알게 되었다.
    
그럼 경계 조건은요?
경계 조건은 접시가 하나일 때 한 번만 움직이면 된다는 것이다.코드에 표시된 출력, 즉 출력이 어디에서 어디로 이동하는지
분석이 끝나면 코드가 자연히 나온다.
void hanoi(int n,char A,char B, char C)
{
           // 
            if(1==n)
            {
                    printf("%c-------%c
",A,C); } else { hanoi(n-1,A,C,B);// 1 hanoi(1,A,B,C); // 2 hanoi(n-1,B,A,C);// 3 } }

예4: 일반 트리 반복 표시


먼저 살펴보십시오.
텍스트 방식으로 트리 A -----------B -----------------------------------------------C ---------D --------------------------------------------H------------------------------------------------J A 유자 나무 노드 B 유자 나무 노드 E D 유자 나무 노드 H I J 전체 출력 인쇄 과정: 인쇄 A 결점 | A의 결점 ---------------------(구체적: 첫째 아이 결점 B를 인쇄하고 B---의-아이 결점을 인쇄한다. 이어서 같은 업무-아이 결점 CD를 인쇄한다....)단독으로 꺼내서 B 아이를 인쇄하는 결점은 다음과 같다. B 결점 인쇄 | B 결점을 인쇄하는 아이는 A, B 아이에게 인쇄를 집행하는 기능이 똑같다. 이것이 바로 귀속이다!
먼저 추이 관계를 찾다.
                            
1단계: 루트 노드 찾기, 출력
2단계: 아이 결점 찾기, 출력
                                        
----------이것이 바로 점차적 관계인데, 함수의 기능은 부모 결점을 먼저 인쇄한 다음에 아이의 결점을 인쇄하는 것이다.우리는 아이의 결점을 인쇄할 때 같은 기능을 필요로 한다.                     
static int recurse_display(GTreeNode * node,int format)
{
        int i;
        if(NULL!=node)
        {
           //1. 
               
            //1.1 
           for(i=0;idata));
           
           //1.3. 
          printf("
"); //2. for(i=0;ichild);i++) { //2.1 TLNode* trnode=(TLNode*)LinkList_Get(node->child,i+1); //2.2 recurse_display(trnode->node,format+4); } } }

예5.1+2+... +n


곱셈, for, while,if,else,switch,case 등 키워드와 조건 판단 문장을 사용할 수 없음(A?B:C).
이 문제는 일반적인 구해에 귀착된다.
먼저 추이 관계를 찾다.
1+2+를 원하시면...n:
1:1+2+.+n-1
단계 2:n + 단계 1의 값
이것이 바로 점차적인 관계입니다. 1+2++를 구합니다.n, 1 + 2 + 를 역구해야 하는데...+n-1 !!!
그럼 국경 조건은요?
n이 0보다 작으면 및 0
이것이 바로 국경 조건이다
long getSumofN (int n)
{
         if(n<=0)
               return 0;
        else 
              return ( n+getSumofN(n-1) );
}

여기에 if else가 나타나서 문제의 뜻을 만족시키지 못하기 때문에 두 가지 문제를 해결해야 한다. 경계 조건을 어떻게 판단하고 매번 계산한 소득치를 어떻게 저장하는지 해결 방법: 집행---논리적 판단--문장
int getSumofN(int n, int *result)
{
        n&&getSumofN(n-1,result);    // , , 1
        return (*resulet +=n);   // 2
}

진일보 기력:
int getSumofN(int n, int *result)
{

        return n&&getSumofN(n-1,result)&&(*resulet +=n);   // ! 
}

좋은 웹페이지 즐겨찾기