递归---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)    //调用递归体,当还没有读取完数据的时候
  }
}
posted @ 2021-04-09 23:15  网抑云黑胶SVIP用户  阅读(105)  评论(0编辑  收藏  举报