提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
递归例题
1.爬楼问题
/**
* 每次步长为1或者为2 或者为3 爬n阶楼梯 共有多少种方式
*/
public static int Func(int n ){
//没有楼梯只有一种方式
if (n==0){
return 1;
}
if (n==1){
return 1;
}
if (n== 2 ){
return 2;
}
// 从后往前分析 让还差1步 差2步 差3步 的方式之和相加
return Func(n-1)+Func(n-2)+Func(n-3);
}
2.求a的n次幂
public static int powFunc1(int a, int n){
//保存结果
int res=1;
if (n==0){
return 1;
}
// 遍历相乘n次
for (int i = 0; i < n; i++) {
res=res*a;
}
return res;
}
二分法例题
// 二分法模板
/**
* int begin=0
* int end =a.length-1最后一个
* while(begin+1<end){
* mid = begin+ ((end-begin)>>1)
* if(条件)
* {
* 判断在左边 end =mid-1
* }
* if()
* {
* 判断在右边 begin=mid+1
* }
* }
*/
1.旋转数组找最小值
/**
* 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个
* 旋转,输入旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转吗,该数组的
* 的最小值为1
*/
/**
* 有序数组
* @param a
* @return
*/
public static int findMin(int []a) {
int begin,end,mid;
begin=0;
end=a.length-1;
if(a[begin]<a[end]){
return a[begin];
}
while(begin+1<end){
mid=begin+((end-begin)>>1);
if(a[begin]<=a[mid]){
begin=mid;
}
else {
end=mid;
}
}
return a[end];
}
经过分析,最小值总是挨着最大值,并且最小值总是在无序的一边
2.排序后的字符数组找指定字符串的索引
/**
* 有个排序后的字符串数组,其中散布着一些空字符串,
* 编写一个方法,找出给定字符串(肯定不是空字符串)的索引。
*
*/
public static int findIndex(String [] strings,String str){
int begin = 0;
int end = strings.length-1;
// 二分条件
while (begin<=end){
// 找到中点
int midIndex= begin+((end-begin)>>1);
//如果中点值是空串则右移
while (strings[midIndex].equals("")){
midIndex++;
//找不到退出
if (midIndex>end){
return -1;
}
}
//判断在左边
if (strings[midIndex].compareTo(str)>0){
end=midIndex-1;
}else if (strings[midIndex].compareTo(str)<0){
begin=midIndex+1;
}else {
//相等则返回
return midIndex;
}
}
return -1;
}
3.二分法加递归求解a的n次幂
/**
* 二分递归求解
* @param a
* @param n
* @return
*/
public static int powFunc(int a,int n){
// 递归出口
if(n==0){
return 1;
}
//
int res=a;
// 记录已经求解的幂的次数
int ex=1;
// 判断是否能够翻倍
while (ex<<1<n){
// 能翻倍
res=res*res;
//指数减半
ex=ex<<1;
}
// 递归求 剩下的n-ex次mi
return res*powFunc(a,n-ex);
}