C 언어에서 재귀란 무엇인가요? 다음 글은 고전적인 재귀 함수 예제를 통해 C 언어의 재귀를 이해하는 데 도움이 될 것입니다.
재귀는 정의나 설명에서 자신을 직접 또는 간접적으로 호출하는 방법이 있는 프로세스 또는 함수입니다. 재귀 함수는 직접 또는 간접적으로 자신을 호출하는 함수, 즉 자체 프로세스를 호출합니다. .
재귀를 처음 접하는 학생들은 다음과 같이 이해하기 어려운 점이 많을 수 있습니다.
함수가 자체 내에서 호출할 수 있는 이유는 무엇인가요? 그렇다면 재귀 작업 중에 서로 중첩된 많은 레이어가 있어야 합니다. 언제 더 이상 중첩되지 않습니까?
재귀 작업 중에 매개변수는 서로 중첩된 여러 레이어 간에 전달됩니다. 여러 레이어가 서로 영향을 미치나요?
재귀의 두 가지 요소
재귀 경계
재귀의 논리 - 재귀 "공식"
재귀 프로세스에는 매개변수 변경이 있어야 하며 매개변수 변경은 재귀 경계와 관련됩니다.
재귀의 다양한 문제를 이해하는 학생은 한 문장으로 명확하게 설명할 수 있지만 이해하지 못하는 학생은 아무것도 할 수 없습니다. 이해하세요.
몇 가지 간단한 예를 통해 재귀를 [경험]해 봅시다. 먼저 [지각적] 관점에서 재귀를 이해해 보세요.
1. 피보나치 수피보나치 수까지의 재귀 공식은 F입니다. (0 )=F(1)=1,F(n)=F(n-1)+F(n-2) n>=2;이것은 n=0 또는 1일 때 재귀 경계 F를 명확하게 제공합니다. (n)의 값과 재귀논리 F(n)=F(n-1)+F(n-2), 즉 재귀공식이므로 이 재귀함수는 작성하기 어렵지 않습니다
#includeusing namespace std; int F(int n)//函数返回一个数对应的Fibonacci数{ if(n0 || n1)//递归边界 return 1; return F(n-1) + F(n-2);//递归公式} int main(){ //测试 int n; while(cin >> n) cout << F(n) << endl; return 0; }2 . 계승의 재귀 공식 :n*F(n-1)
코드는 다음과 같습니다:
#includeusing namespace std; int F(int n){ if(n==0)//递归边界 return 1; return n*F(n-1);//递归公式} int main(){ int n; cin >> n; cout << F(n) << endl; return 0; }
배열 a[]:a[0],a[ 1],…,a[n -1] 재귀를 사용하여 합산하는 방법은 무엇입니까? 두 가지 질문이 더 있습니다: 재귀 경계와 재귀 공식.
재귀 경계가 무엇인가요? 지금은 생각하기 쉽지 않은데 합산을 생각하는데, x, y, z, w를 수동으로 합산하는 과정이 뭔가요? 단계는 다음과 같습니다.
x+y=a, 작업은 a, z, w 및 sum
a+z=b가 되고, 작업은 b, w 및 sum
b+w=c가 됩니다. 답변
생각해보기 잠시 [답 얻기] 왜 이 단계에서 답을 얻을 수 있을까요? (말도 안 되는 소리?) 숫자를 더하지 않고도 답을 얻을 수 있기 때문이죠.
그렇다면 재귀의 경계는 숫자가 하나뿐이라는 것입니다.
그렇다면 재귀의 경계는 거기 있는데, 재귀식은 어떻게 될까요? 실제로 수동 계산 과정에는 재귀 공식이 암시되어 있습니다.
여기서 +는 두 숫자의 합이고 F는 여러 숫자의 합을 구하는 재귀 함수입니다. 코드는 다음과 같습니다.
#includeusing namespace std; int F(int a[],int start,int end){ if(start==end)//递归边界 return a[start]; return a[start] + F(a,start+1,end);//递归公式} int main(){ int a[] = {1,2,3,4,5}; int s=0,e=4; cout << F(a,s,e) << endl; return 0; }4 . 배열 요소의 최대값을 찾습니다.
최대값을 수동으로 찾는 과정은 순회+비교이며, 과정은 다음과 같습니다. 예를 들어 3,2,6의 최대값을 찾으려면, 7,2,4: 먼저 최대값을 max=-999999로 설정한 다음 최대값과 배열 요소를 하나씩 비교하도록 설정합니다(트래버스). a[i]>max이면 max 값을 a[i]로 업데이트합니다. , 그렇지 않으면 max는 변경되지 않고 순회가 끝날 때까지 계속해서 뒤로 순회합니다.
max869435f0c0c735bef3ba220342fdba792, max=3은 변경되지 않고
maxddf8d3c7a24382ab9be33e0e37b855e12, max=7은 변경되지 않습니다
max>4, max=7은 변경되지 않습니다
순회가 종료되고 max=7이 최대값입니다.
합계와 유사합니다. 재귀 공식은 다음과 같습니다.
여기서 max는 두 숫자의 더 큰 값 함수이고 F는 배수를 찾는 함수입니다. 숫자의 최대 값에 대한 재귀 함수는 다음과 같습니다.
#includeusing namespace std; #define max(a,b) (a>b?a:b) int F(int a[],int s,int e){ if(s==e) return a[s]; else if(s+1 == e)//递归边界 return max(a[s],a[e]); return max(a[s],F(a,s+1,e));//递归公式!!!} int main(){ int a[] = {5,1,4,6,2}; int s = 0,e = 4; cout << F(a,s,e) << endl; return 0; }
이유. 위의 예가 [간단한 예]인 이유는 위의 재귀가 모두 [단방향 재귀]에 속하기 때문입니다. 단방향 재귀, 재귀 경로는 단방향이므로 상대적으로 생각하기 쉽습니다.
어려운 재귀입니다. 문제는 일반적으로 단방향 재귀가 아니라 [역추적]을 사용해야 합니다. 재귀적 방법은 생각하기 쉽지 않습니다.
위 내용은 C언어에서 재귀란 무엇인가요? 클래식 재귀 함수 예제 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!