内容纲要
215讲方法的递归、斐波那契、老鼠走迷宫
- return返回:在哪里调用就在哪里返回
- factorial阶乘,递归实现阶乘。
-
谁调用就把结果返回给谁
-
如果递归的是数组或者对象等引用类型,则会相互影响结果。
斐波那契
public class Test{
public static void main(String[] args){
F f = new F();
int n = 7;
int res = f.fibonacii(n);
if(res == -1){
System.out.println("输入的数有误。");
}else
System.out.println("斐波那契数的第n个是 = " + f.fibonacii(n));
}
}
class F{
/*
思路分析:
1.如果方法中的形参定义数列的位置,如果n = 1,2则结果是2
2.n = f(n-1) + f(n-2)
*/
int num;
public int fibonacii(int n){
if(n == 1 || n ==2){
num = 1;
return 1;
}else if(n >= 3){
num = fibonacii(n-1) + fibonacii(n-2);
return num;
}else{
return num = -1;
}
}
}
package main.daytwo;
//猴子吃桃子
public class Test{
public static void main(String[] args){
P monkey = new P();
int n = 1;
int res = monkey.peach(n);
if(res == -1){
System.out.print("输入有误,请输入1-10");
}else{
System.out.println("第" + n + "天还剩" + monkey.peach(n) + "个桃子");
}
}
}
class P{
/*
猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中一半,并再多吃了一个!
以后每天猴子都吃其中的一半,然后再多吃一个,当到第10天时,再想多吃(即还没吃),
发现只有1个桃子了。问题:最初共 多少个桃子?
*/
/*
思路分析:
1.逆向分析。
2.第10 天的时候只有1 个桃子,
3.第9天则有 day9 = 2*(day10 + 1)个桃子
4.第8天则有 day8 = 2*(day9 + 1)个桃子
*/
public int peach(int day){
int num;
if(day >= 1 && day <= 10) {
if (day == 10) {
return num = 1;
} else {
num = 2 * (peach(day + 1) + 1);
return num;
}
}else{
return -1;
}
}
}
- 斐波那契数列
- 猴子吃桃子
老鼠走迷宫
注意:找路策略改变之后,路径也会发生变化。
心得:
-
每移动一个位置map[i][j]==0 然后给它赋值为map[i][j]=2;很重要,这是给小球每移动一下时候做个标记2为路径。
-
当小球下左右被挡的时候它会回溯到上一个点,并绕过往下走的路,妙啊!!!!请用内存图分析,有意思。
//老鼠走迷宫
package main.daytwo;
public class MiGong {
public static void main(String[] args) {
AA a = new AA();
/*老鼠走迷宫
用二维数组创建迷宫。以1 为墙壁,0 为可走路径。
*/
int[][] map = new int[8][7];
for (int i = 0; i < map[0].length; i++) {//这里创建上下底的地图边界
map[0][i] = 1;
map[7][i] = 1;
}
for (int i = 0; i < map.length; i++) {//这里创建地图左右边界
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
map[2][2] = 1;
System.out.println("======遍历地图====");
for (int j = 0; j < map.length; j++) {
for (int i = 0; i < map[j].length; i++) {
System.out.print(map[j][i] + " ");
}
System.out.println();
}
System.out.println("====地图制作完成=====");
a.findWay(map,1,1);
System.out.println("===打印成功的地图===");
for (int j = 0; j < map.length; j++) {
for (int i = 0; i < map[j].length; i++) {
System.out.print(map[j][i] + " ");
}
System.out.println();
}
}
}
class AA {
//创建一个初始点鼠鼠在map[1][1];
//定义规则,老鼠可以走的点标记为2;老鼠不能走的点标记为3.墙壁自然是1;
//当走到map[6][5];时表示成功,并退出循环;
//有一个寻址规则,下右上左 方式寻路
public boolean findWay(int[][] map, int i, int j) {
if (map[6][5] == 2) {
System.out.println("成功,老鼠走出迷宫");
return true;
} else {
//假设老鼠能走下一步;
if (map[i][j] == 0) {
map[i][j] = 2;
if (findWay(map, i + 1, j)) {//下
return true;
} else if (findWay(map, i, j + 1)) {//右
return true;
} else if (findWay(map, i - 1, j)) {//上
return true;
} else if (findWay(map, i, j - 1)) {//左
return true;
} else {
map[i][j] = 3;
return false; //这里很好玩,要是return true则会执行到这里就跳出循环。
}
}else
return false;
}
}
}