目录
递归小练习
学习java不久,大佬勿喷,如果有什么不对的地方可以指出多多交流。(后续有时间练习还会继续更新)
加油!!
1、指定一个数,求出它相应的斐波那契值
思路:1,1,2,3,5,8,13,21
假设我现在想输出第5个斐波那契值
这时我需要知道第3个和第4个数的值,从这里又可以推出,第3数需要知道第1和第2个数的值,第4个数需要知道第2和第3个数,而第3个有需要知道第1和第2个数
所以:可以得出
第5个数:(5-1) + (5-2) = 》 4 + 3 第4个数 = 下面这一行的值 ==============》 3+2 = 5
第4个数:(4-1) + (4-2) = 》 3 + 2 第3个数 = 下面这一行的值 ==============》 2+1 = 3
第3个数:(3-1) + (3-2) = 》 2 + 1 第2个数 = 1 所以 实际 第3个数 ==========》 1+1 = 2
(第2个数+和第1个数就是1)
第2个数:1
第1个数:1
最后得出:每一次递归都需要 (当前数-1) + (当前数-2) ,当数字为1和2时,直接返回1。
代码实现:
public static void main(String[] args) {
// 1,1,2,3,5,8,13,21
int count = 6;
int num = digui(count);
System.out.println(num); // 8
}
public static int digui(int num){
if(num == 1 || num == 2){
return 1;
}else{
return digui(num-1) + digui(num-2);
}
}
2、猴子偷桃问题
一个猴子来到山里的一棵桃树下,发现有一堆桃子。第一天它吃了一半,然后又多吃了一个桃子。第二天它又吃了一半,又多吃了一个桃子,第三天····,第十天的时候(还没吃),只剩下一个桃子了,问最初这里一共又多少个桃子?
思路:每一天吃了一半+1个桃子
可以得出:前一天桃子数 = 2 * 当前天桃子树 + 1,当到第10天时,只剩下一个桃子了
代码实现:
public static void main(String[] args) {
// 给一个参数1,表示它第一天只剩下一个桃子
// 第二个参数10,表示第10天就没有桃子吃了
int a = digui(1,10);
System.out.println(a); // 1535
}
private static int digui(int taozi,int day) {
// 从第十天反向推出第一天得桃子数最后程序终止并返回
if(day<=1){
return taozi;
}else{
return digui(2*(taozi+1),--day);
}
}
3、老鼠出宫
图中表是一个地图,红色部分表示障碍,老鼠初始位置在左上角,需要让老鼠走到右下角
第一步:构建地图
思路:从图中可以知道这种结构,可以使用二位数组来解决
定义一个数组,列和行都设置为8
int[][] map = new int[8][8];
然后给地图设置边界
// 给上下做边界
for (int i = 8; i > 0; i--) {
maps[i-1][0] = 1;
maps[i-1][7] = 1;
}
// 给左右做边界
for (int i = 7; i > 0; i--) {
maps[0][i-1] = 1;
maps[7][i-1] = 1;
}
给地图做障碍
maps[5][1] = 1;
maps[5][2] = 1;
maps[3][1] = 1;
maps[3][2] = 1;
输出查看效果
System.out.println("=========初始地图===========");
for (int[] map : maps) {
for (int s : map) {
System.out.print(s + " ");
}
System.out.println("");
}
输出: (1表示障碍)
=========初始地图===========
1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1
1 1 1 0 0 0 0 1
1 0 0 0 0 0 0 1
1 1 1 0 0 0 0 1
1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1
关键代码:
public static Boolean digui(int[][] map,int x,int y){
// 如果到达了地图最右下角,直接返回false
if(map[6][6] == 2){
return true;
}else{
// 判断如果是0表示路可以走 1:障碍物, 2:可以走, 3:可以走,但是是死路
if(map[x][y] == 0){
map[x][y] = 2;
/*
定义走的机制 (定义的机制决定了老鼠是否可以出宫)
下面代码定义了先从下走,下走不通了再往右走,在往右走不同,再往上走,上走不通再往左走
不同的机制可能会导致走不通,也就会出现地图数字为3的情况
*/
if(digui(map,x+1,y)){
return true;
}else if(digui(map,x,y+1)){
return true;
}else if(digui(map,x-1,y)){
return true;
}else if(digui(map,x,y-1)){
return true;
}else{
map[x][y] = 3;
return false;
}
}else{
return false;
}
}
}
这道题不理解的可以去看看韩顺平老师的讲解,非常棒!!
传送门:https://www.bilibili.com/video/BV1fh411y7R8?p=221&spm_id_from=pageDriver