어떻게 귀속을 이해하고, 귀속을 생각하고, 운용할 것인가
5158 단어 데이터 구조와 알고리즘
귀속: 우선 창고의 지식을 알아야 한다.'후진선출'귀속은 프로그램이 특정한 지점에 실행될 때 자신을 호출한다. 이때 이전에 실행되지 않은 프로그램은 잠시 실행되지 않고 다음 층에서 실행이 끝난 후에 실행된다.이것이 바로 창고에 부합되는 선진적인 후출이다.이럴 때 창고에 들어갈 사람이 있습니다. 다음 층에서 호출이 끝나면 창고를 나가서 계속 운행할 수 있습니다.그 다음에 귀환을 운용하는 데 필요한 두 가지 조건을 알아야 한다. 첫째, 경계가 있어야 한다. 즉, 수출 둘째, 추이 관계가 있어야 한다. 마지막으로 귀환을 사용하는 요령을 기억해야 한다. 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); // !
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.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); // !
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
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--, , !
}
}
먼저 추이 관계를 찾다.
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); // !
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
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);
}
}
}
곱셈, 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); // !
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.