递归步骤:
1.首先分析基础步骤,也就是特殊情况,写出特殊情况
2.调用递归体进行相同的递归调用自身,把相同的大问题变换成小问题
问题1:
当n=0的时候返回1;当n>0的时候,n(n-1)。
相当于这种情况的时候我们可以调用递归体,代码如下:
int factorial(int n){ if(n==0){ return 1; }else{ return n*factorial(n-1) //递归体 } }
问题2:
1,1,2,3,5,8,12,x,x;利用递归
首先基础步骤n=1||n=2的时候都return 1
其它时候都是factorial(n-1)+factorial(n-2)
代码如下:
int factorial(int n){ if(n==1 || n==2){ return 1; } else{ return factorial(n-1)+factorial(n-2); } }
问题3:
计算x为底的n次幂,比如5的100幂
基础步骤
当n0的时候return 1,当n1的时候return x
主要步骤,分析递归过程
5^100 =5^50*5^50 =(5^25)*(5^25)*(5^25)*(5^25) =(5^12*5^12*5)*(5^12*5^12*5)*(5^12*5^12*5)*(5^12*5^12*5*) =(5^6*5^6*5^6*5^6*5)*(5^6*5^6*5^6*5^6*5)*(5^6*5^6*5^6*5^6*5)*(5^6*5^6*5^6*5^6*5) =(5^3*5^3*5^3*5^3*5^3*5^3*5^3*5^3*5)*(5^3*5^3*5^3*5^3*5^3*5^3*5^3*5^3*5)*(5^3*5^3*5^3*5^3*5^3*5^3*5^3*5^3*5)*(5^3*5^3*5^3*5^3*5^3*5^3*5^3*5^3*5) 5^3=>5^2*5=>5*5*5
int power(int x,int n){ int y; if(n==0){ //特殊情况 return 1; } else{ y=power(x,n/2); //调用递归体 y=y*y; if(n%2==1){ //如果余数不为0,那么比如n=101,那么就是y=5^50*5^50*5 y=y*x; } } return y; }
问题4:
求一个数组的主元素
{7,3,2,1,3,3,1,3}
{7,7,7,3,3,7,2,5,2}
思路:
遇到第一个数7,开始计数1;
第二个数3,是不同的,计数器-1,把7和3去除
BOLL candidate(Type A[ ],Type &c,int n,int m){ //n为数组的长度,m每一次递归读取到的下标 int count=0; int j=m; c=A[m] //存储第一个数 while(j<n-1 && count>0){ j=j+1; c=A[j]; if(A[j]=!c){ //比较两个数是否相等 count=count+1; }else{ count=count-1; } } if(j==n-1 && count>0){ return A[j]; //返回此时还剩的元素,很有可能为主元素 }else(j==n-1 && count==0){ return false; //都删除完了,没有主元素 }else(j<n-1){ return candidate(A,c,n,j+1) //调用递归体,当还没有读取完数据的时候 } }