当前位置: 首页 > news >正文

【Java学习笔记】递归

递归(recursion

思想:把一个复杂的问题拆分成一个简单问题和子问题,子问题又是更小规模的复杂问题,循环往复

本质:栈的使用

递归的注意事项


递归的内存机制分析

代码示例


public class Recursion01 {public static void main(String[] args) {Tt1 = newT();t1.test(4);//输出什么? n=2 n=3 n=4}}class T {public void test(int n) {if (n > 2) {test(n- 1);}System.out.println("n=" + n);}
}

内存视图分析

在这里插入图片描述


递归实例

案例一:阶乘问题(factorial

import java.util.Scanner;
public class recursion {public static void main(String[] args){Scanner input = new Scanner(System.in);object object = new object();System.out.print("input a number:");long n = input.nextLong();long result = object.factorial(n);System.out.print("factorial(" + n + ") is:" + result);}
}class object{public long factorial(long n){if(n == 1){return 1;}else{return n * factorial(n - 1);}}
}

案例二:猴子吃桃问题

有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第 10 天时,想再吃时(即还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?

public class recursion {public static void main(String[] args){method t = new method();int res = t.peach(1);System.out.print(res);}
}class method{public int peach(int day){if(day == 10){return 1;} else if(day >= 1 && day <= 9){return ( peach(day + 1) + 1 ) * 2;   // 枚举每天的情况找规律得到}else{return -1;}}
}

案例三:斐波那契数列

1,1,2,3,5,8,13…给你一个整数 n,求出它的值是多少?

特点:从第三个数开始,后一个数等于前面两个数之和

//斐波那契数列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){method t = new method();int res = t.fibonacci(10);System.out.print(res);}
}class method{public int fibonacci(int n){if(n == 1 || n == 2){return 1;}else{return fibonacci(n - 1) + fibonacci(n - 2);}}
}//输出:55

案例四;汉诺塔

有趣的小故事

在这里插入图片描述

思路分析:可以把这个问题拆分

//斐波那契数列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){tower t = new tower();t.move(3, 'a', 'b', 'c');}
}class tower{// 移动的圆盘个数, A塔 ,B塔 , C塔public void move(int num, char a, char b, char c){if(num == 1){System.out.println(a + "->" + c);}else{// 把上面的 n-1 个圆盘从 a塔 移动到 b塔,中间借助 c 塔move(num -1, a, c, b);// 把最下面的圆盘移动到 c塔System.out.println(a + "->" + c);// 把 b塔 的所有盘移动到 c塔,中介借助 a塔move(num -1, b, a, c);}}
}//输出
a->c
a->b
c->b
a->c
b->a
b->c
a->c

迷宫问题

在这里插入图片描述

思路:运用二维数组表示迷宫,初始位置为(1,1),走到出口处,标记路线

代码示例

public class migong {public static void main(String[] args){int[][] map = new int[8][7];//标记墙面的部分for(int i = 0; i < 8; i++){map[i][0] = 1;map[i][6] = 1;}for(int i = 0; i < 7; i++){map[0][i] = 1;map[7][i] = 1;}map[3][1] = 1;map[3][2] = 1;// 回溯测试:辅助理解方法调用完成后栈空间释放,是如何返回的
//        map[2][2] = 1;// 封闭路径,测试结果
//        map[2][1] = 1;
//        map[2][2] = 1;
//        map[1][2] = 1;// 调用方法t finder = new t();finder.findway(map,1,1); // 起点是(1,1)//打印找路结果for(int i = 0; i < map.length; i++){for(int j = 0; j < map[i].length; j++){System.out.print(map[i][j] + " ");}System.out.println("");}}
}class t{public boolean findway(int[][] map, int i, int j){// 找路策略:下右上左// 如果找到了就出口返回 trueif(map[6][5] == 7){return true;}else{if(map[i][j] == 0){//假设当前点使用探路策略可以走通,就说明可以和之前的点衔接起来构成一条可以走通的路线map[i][j] = 7;// 接着使用找路策略开始探路,验证当前点开始是否可以走通//往下走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;}// 都走不通,走过了但是走不通就标记为 3else{map[i][j] = 3;return false;}}else{  // 此时 map[i][j] = 1, 7, 3 ; 7 表示测试过了就不要再重复测试return false;}}}
}

理解:没走到一个点,就会递归的使用下->右->上->左的方式进行探路,如果都走不通就会返回到上一次递归调用,继续探路,指导找到出口为止

相关文章:

  • 【白雪讲堂 】GEO兴起:AI搜索时代的内容优化新战场
  • 哈希表笔记(三)Java Hashmap
  • 用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]
  • AXI中的out of order和interleaving的定义和两者的差别?
  • mysql-窗口函数一
  • 缓存:缓解读库压力的高效方案与应用实践
  • Transformer架构的解耦重组现象
  • JVM——Java 虚拟机是如何加载 Java 类的?
  • RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(下)
  • 记录搭建自己的应用中心-需求看板搭建
  • 如何解决 H5 远程收款的问题呢?
  • 计算机网络——HTTP/IP 协议通俗入门详解
  • 人工智能——DBSCAN 聚类算法
  • 前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
  • Java学习手册:Spring 事务管理
  • Unity SpriteRenderer(精灵渲染器)
  • 【专题五】位运算(2)
  • 【5G 架构】边缘计算平台是如何与3GPP网络连接的?
  • 【云原生】基于Centos7 搭建Redis 6.2 操作实战详解
  • C++负载均衡远程调用学习之消息路分发机制
  • 刘洪洁已任六安市委副书记、市政府党组书记
  • 中国固体火箭发动机领域杰出专家赵殿礼逝世,享年92岁
  • 停电催生商机,中国品牌 “照亮” 西班牙
  • 美乌签署协议建立美乌重建投资基金
  • 【社论】法治是对民营经济最好的促进
  • 擦亮“世界美食之都”金字招牌,淮安的努力不止于餐桌