递归由两部分组成,一部分是函数的描述,另一部分是函数终结的端口。(先看,后面会一下子感悟)
一个小栗子:计算1-100的相加之和。
分析下:我们来找函数描述:1+2+3+4······+n
我们再来找结束口 n=1;
#include <iostream>
using namespace std;
int JC(int n);
int main(){
cout<<JC(100);
return 0;
}
int JC(int n){
int sum=0;
if(n==1){
return 1;//递归的出口
}
else
return JC(n-1)+n;//公式抽象::f(n)=f(n-1)+n
}
求数组的前n项和。 把一个数组看成两部分,比较两部分大小。然后寻找递归出口。最后肯定就是一位数
#include <iostream>
using namespace std;
int sum(int*a,int n);
int main(){
int a[]={1,2,3,8,7,6,2};
cout<<sum(a,6);
return 0;
}
int sum(int*a,int n){
if(n==0){
return a[0];//递归的出口,如果本身就一个则其本身就是最大值。
}
else
return sum(a,n-1)+a[n];
}
递归实现选出数组最大值。
#include <iostream>
using namespace std;
int max(int*a,int n);
int main(){
int a[]={1,2,3,8,7,6,2};
cout<<max(a,6);
return 0;
}
int max(int*a,int n){
if(n==0){
return a[0];//递归的出口
}
else if(max(a,n-1)>a[n])
return max(a,n-1);
else
return a[n];
}
最后点下笔,理解递归,首先需要理解函数的嵌套调用,也就是理解一个函数调用另外一个函数的时候,系统做了什么。确切的说,运行栈的机制。
向一个玻璃杯里放乒乓球,放入1号再放入2号再放入3号,然后取出的顺序则为3,2,1,这种先进后出的数据结构即为栈。那递归与栈又又什么关系呢?其实递归函数就是在调用栈!