java基础之递归

目录

递归小练习

1、指定一个数,求出它相应的斐波那契值

代码实现:

2、猴子偷桃问题

代码实现:

3、老鼠出宫

关键代码:


 


递归小练习

学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值