java 方法递归入门 相关知识点

本文介绍了Java中方法递归的基本概念,包括递归的使用条件和两种类型:无返回值递归与有返回值递归。无返回值递归更类似于普通循环,而有返回值递归则涉及值的计算与逆序执行。通过实例解析了递归方法的执行过程,并提供了相关应用场景的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法递归:一个方法在执行时又调用自身的过程,成为递归,运用递归的就叫递归方法。

什么时候使用递归方法?

1 一个大问题可以拆分为多个子问题

2 拆分后的子问题除了数据规模不同之外,解决的思路完全相同

3 存在递归终止条件(拆分子问题是有限的,并不能无限拆分下去)

方法递归有两种

第一种 是没有返回值的方法递归,他所包含的执行语句(或者没有执行语句)不需要返回值就可以执行

下图为例子:该代码没有返回值,定义方法前使用返回值类型void,执行语句,if内为终止语句

system.out.print(num%10+”“);  在printReverse方法中,直接用num输入值,不需要返回值就可以执行。特别的,个人觉得一般存在执行语句的情况下,不需要返回值的递归,执行语句一般在递归方法调用之前。

个人理解,这种递归方法更像普通的循环语句。(特别的,个人理解递归方法就是一种特殊的循环方法)

第二种是有返回值的递归方法,方法的返回值类型为 返回值的类型

具体的执行过程可以参考csdn的其他相关文章,此处叙述个人理解

个人理解:可以把操作过程理解为先不管执行语句,先把所有的递归方法所输入的值先计算出来,然后一个一个把刚刚计算好的输入的值,逆序放入执行语句,进行执行,然后最后,到第一个输入的值,执行完就是整个输出的值。

下图为例子:特别的,该方法返回值类型为空,但是存在返回值,因为返回值被system.out.print接收。

上图中一开始的输入的值为1729  目标为输出各个位的数字 

依据个人理解,上图中,先计算递归方法的输入的值(print(num/10));

分别为 172 17 1 ,然后逆序放入执行语句,1放入后执行结果为打印”1”(因为此时小于10,直接执行终止语句,打印本身),17放入执行结果为7(system.out.print(num%10+“”);),172放入执行结果为2,最后1729放入 执行为9,则完成整个递归方法的输出 1729.

/** * * @author SunnyMoon */ ////////////////////////////////////////////////////////////////////////////// /** * 概念介绍: * * 消除递归: * 一个算法作为一个递归方法通常从概念上很容易理解,但实际使用中递归的效率不高,在这种 * 情况下,把递归算法转换成非递归算法是非常有用的,这种转换经常用到栈。 * * 递归和栈: * 递归和栈之间有着紧密的联系,大部分的编译器使用栈实现递归的。 * * 调用方法的时候发生什么: * 1. 编译器会把这个方法所有当前参数及返回地址压入栈中; * 2. 将控制权交给这个方法方法通过获得栈顶元素值访问参数; * 3. 方法运行结束的时候,值退栈,参数消失且控制权重新回到返回地址; * * 模拟递归方法: * 可以将任意一个递归方法转换为非递归的基于栈的方法。在一些简单的情况可以完全消除栈,只 * 使用一个简单的循环,但是在很复杂的情况,算法中必须须要保留栈。本例子是简单的情况,可 * 以进一步完全消除栈。 */ ///////////////////////////////////////////////////////////////////////////// /** * 计算三角数字的问题: * 递归算法描述如下 * int triiangle(int n){ * if(n==1) * return 1; * else * return (n+triangle(n-1)); * } */ import java.io.*; /** * 模拟一个递归方法,通用的方式消除递归 */ class Params {//封装了方法的返回地址和方法的参数 public int number; public int returnAddress; public Params(int num, int returnAdd) { number = num; returnAddress = returnAdd; } } class StackX {//模拟递归时使用的栈 private int maxSize; private Params[] stackArray; private int top; public StackX(int s) { maxSize = s; stackArray = new Params[maxSize]; top = -1; } public void push(Params p) { stackArray[++top] = p; } public Params pop() { return stackArray[top--]; } public Params peek() { return stackArray[top]; } } class StackTriangleApp { static int theNumber; static int theAnswer; static StackX theStack; static int logicAddress; static Params theseParams; public static void main(String[] args) throws IOException{//主方法 System.out.print("Number = "); theNumber = getInt(); stackTriangle(); System.out.println(""); System.out.println("Trriangle = " + theAnswer); } @SuppressWarnings("empty-statement") public static void stackTriangle() {//计算三角数字的方法,模拟递归方法 theStack = new StackX(100); logicAddress = 1;//设置一个逻辑地址为入口地址 while (step() == false); } public static boolean step() { switch (logicAddress) { case 1: theseParams = new Params(theNumber, 6);//设定循环返回的地址 theStack.push(theseParams); logicAddress = 2; break; case 2: theseParams = theStack.peek(); if (theseParams.number == 1) { theAnswer = 1; logicAddress = 5; } else { logicAddress = 3; } break; case 3: Params newParams = new Params(theseParams.number - 1, 4); theStack.push(newParams); logicAddress = 2; break; case 4: theseParams = theStack.peek(); theAnswer = theAnswer + theseParams.number; logicAddress = 5; break; case 5: theseParams = theStack.peek(); logicAddress = theseParams.returnAddress; theStack.pop(); break; case 6: return true; } return false; } public static String getString() throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); return s; } public static int getInt() throws IOException{ String s=getString(); return Integer.parseInt(s); } } /** * 总结: * 当要求效率的时候可以把弟归转化为基于栈的非递归,进而可以把基于栈的转化为仅有循环的 * 非递归,这种情况下效率是最高的。 * 但是一些复杂的情况可以转化为基于栈的非递归,但是无法消除栈的。 * 一些递归算法是非常优秀的,比如分治算法。 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落尽舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值