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

【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;}}}
}

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

http://www.xdnf.cn/news/3263.html

相关文章:

  • CSS响应式与自适应设计
  • 【Linux网络】I/O多路转接技术 - epoll
  • 1.67g 雨晨 22635.5305 Windows 11 企业版 23H2 极速增强版
  • 【中间件】bthread_数据结构_学习笔记
  • 线段树原理和代码详解
  • JavaScript基础-递增和递减运算符
  • 二、HTML
  • PostgreSQL数据表操作SQL
  • C标准库(libc)接口及示例解析
  • 从股指到期指,哪些因素影响基差?
  • 51c嵌入式~单片机~合集9
  • [操作系统] 线程互斥
  • 【Linux知识】Shell脚本中各类参数传递以及获取
  • Elastic Search 的安装、使用方式
  • 【分享】deepseek 超强ai助手 1.1.8最新版 不卡顿
  • Python字典(dict)详解:从创建到操作全掌握
  • Anaconda中配置Pyspark的Spark开发环境
  • 使用listPersonalCertificates 命令列示WebSphere Application Server特定密钥库中的个人证书
  • 【Android】四大组件之ContentProvider
  • 比较图检索增强生成(Graph RAG)和向量检索增强生成(Vector RAG)
  • L3-041 影响力
  • 如何在Cursor中使用MCP服务
  • Leetcode刷题记录24——最大子数组和
  • Java SE(6)——类和对象
  • 数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?
  • 手搓传染病模型(SEIAR)
  • python3GUI--视频监控管理平台 By:PyQt5(详细讲解)
  • 多商户商城系统开发全策略:从技术架构到流量增长
  • python如何word转pdf
  • Node.js心得笔记