递归---java
递归步骤:
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,13,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) //调用递归体,当还没有读取完数据的时候
}
}