蓝桥算法,每天一道(二)
二、查找与排序
目标:
①对递归建立起感觉
②学会评估算法性能
③大致预估程序执行时间
1、递归
递归——自己调用自己,先来个最简单例子
public class Recursive {
public static void main(String[] args) {
f(10);
}
//千万注意不要死循环
static void f(int i) {
if(i==0)
return;
//调用自身
f(i-1);
}
}
然后先来一些简单案例
牢记在心三步骤:
① 找重复:对原问题的重复,规模更小——子问题
② 找变化:变化的量应该作为参数,适当时要自行添加参数
③ 找边界:出口,就是条件,不能死循环下去
求阶乘
/*
*求n的阶乘
*找重复:n*(n-1),n-1的阶乘是对原问题的重复,只是规模更小——子问题
*找变化:变化的量应该作为参数 n
*找边界:出口,就是条件,不能死循环下去
*/
public class JieCheng {
public static void main(String[] args) {
System.out.println(func(10));
}
public static int func(int n) {
//写终止条件
if (n==1)
return 1;
return n*func(n-1);
}
}
打印i-j
/*
*打印i-j
* 找重复:i不断增加靠向j--->i+1
* 找变化:i不断增加
* 找出口:终止条件--->i>j则停止
*/
public class Print {
public static void main(String[] args) {
func(1,10);
}
public static void func(int i,int j) {
if (i>j)
return;
System.out.print(i+" ");
func(i+1,j);
}
}
对arr所有元素求和
/*
* 对arr所有元素求和
* 重复:数组里我们要开始的那块,假设为begin
* 变化:数组长度、起点在变化,所以必须要加参数就是begin
* 出口:当begin==arr.length-1
*/
public class ShuZu {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//从索引0处开始求和
System.out.println(fun(arr,0));
}
public static int fun(int[] arr, int begin) {
if (begin==arr.length-1) {
return arr[begin];
}
return arr[begin]+fun(arr,begin+1);
}
}
反转
/*
* 反转
* 重复:[a,b,c,d]-->d reverse[a,b,c]-->c reverse[a,b]-->b reverse[a]-->[d,c,b,a]
* 这一反转过程就在不断重复
* 变化:应该是最后的那个数字,我们设置其索引为end
* 出口:本例中end为3,当其反转成为0时,结束即可
*/
public class Reverse {
public static void main(String[] args) {
System.out.println(fun("abcd",3));
}
public static String fun(String src,int end) {
if (end==0) {
return ""+src.charAt(0);
}
return src.charAt(end)+fun(src,end-1);
}
}
总结:在重复中找变化,在变化中找重复。