学习任务:

视频学习定义递归方法

动手编写递归方法

一个方法调用自己叫方法的递归调用,方法的递归调用也可以重复执行一段代码,下边看个例子:

使用循环和递归两种方法分别实现求数据区间的累加和。

import java.util.Scanner;

/**
 * 	面向过程编程-递归-入门
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class RecursionDemo1 {

	
    public static void main(String[] args) {
    	//求1到3累加和
    	int x = sum_recursion(1, 3);
    	System.out.println(x);
    }
    
    //求几个数的累加和,使用递归
    public static int sum_recursion(int start,int end) {
    	if(start == end) {
    		//返回具体的值
    		return end;
    	}
    	//仍然递归调用
    	return start+sum_recursion(start+1, end);
    }
    //使用循环实现累加和
    public static int sum(int start,int end) {
    	int sum = 0;
		for(int i = start;i<=end;i++) {
			sum +=i;
		}
		return sum;
	}
}

sum_recursion(int start,int end)方法采用递归实现,sum(int start,int end)采用循环实现。

下边研究一下sum_recursion方法的递归执行流程,见下图:

image-20210118105347237

1)main方法调用sum_recursion方法,传入1,3。

2)sum_recursion方法调用sum_recursion方法,传入2,3。

3)sum_recursion方法调用sum_recursion方法,传入3,3。

4)sum_recursion方法判断start等于end,返回3给上个调用者。

5)sum_recursion方法返回2+3给上个调用者。

6)sum_recursion方法返回1+2+3给main方法。

我们发现方法的递归调用和方法之间的调用流程是一样,只不过递归调用是调用自己。

如果sum_recursion方法中没有下边的语句将会有什么结果:

if(start == end) {
    //返回具体的值
    return end;
}

我们可以注释掉这段代码试一下,结果程序报错如下:

Exception in thread "main" java.lang.StackOverflowError
	at RecursionDemo1.sum_recursion(RecursionDemo1.java:21)

StackOverflowError表示“栈溢出”错误。

如果屏蔽了这段代码那么sum_recursion方法将会永远的调用自己,不会停止。

所以递归方法定义时要注意:

1)递归方法必须有出口,否则将永远执行下去,下边的代码就是sum_recursion方法的出口。

if(start == end) {
    //返回具体的值
    return end;
}

2)每次递归调用都会缩小范围,下边的代码是每次的递归调用

return end+sum_recursion(start+1, end);

start+1就是每次调用时传入变量,该变量每次都在更改,直到满足start == end的条件才执行方法的出口。

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题