千峰Java教程:070. 递归算法

19、数据结构之链表

链表(Linked List)一种常见的数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每个节点里存到是下一个节点的指针(Pointer)。

在链表数据结构中,我们需要用到递归算法

递归算法是一种直接或间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而易于理解。

我们来写一下阶乘的代码:

public class Demo1
{
	public static void main(String[] args)
	{
		System.out.println(jiecheng1(10));
		System.out.println(jiecheng2(10));
	}
	
	public static int jiecheng1/*阶乘1,这个方法用for来试试,先不用递归*/(int num)
	{
		int result = num;
		int i = num - 1;
		for( ; i > 1 ; i--)
		{
			result = result * i;
		}
		return result;
	}
	
	public static int jiecheng2(int num)//这次用递归方式,自己调用自己
	{
		if(num == 1)
		{
			return 1;//这里是退出条件,必须有出口
		}
		return num * jiecheng2(num - 1);//这里是调用了自己
	}
}
/*
结果:
3628800
3628800
*/

我们分析一下递归:

1、递归必须要有出口

2、递归内存消耗太大,容易发生内存溢出:比如我们给jiecheng2传入5(计算后输出120),第一步,传入num==5,5!=1,所以返回下面的num*jiecheng2(num-1),就是5*jiecheng2(4),第一次调用这个方法,没有结束,需要等jiecheng2(4)返回值之后才能返回5*jiecheng2(4)才行;然后看jiecheng2(4),4!=1,此时返回的是4*jiecheng2(3),第二次调用这个方法,还没结束,要等jiecheng2(3)返回值才行;接着看jiecheng2(3),按照上面所说,应该返回3*jiecheng2(2);再看jiecheng2(2),应该返回2*jiecheng2(1);这时候,jiecheng2(1)返回的是1,再一步一步的返回前面的数,这样,就变成了1*2*3*4*5=120,最终返回120。这时候,方法被调用了5次,入了5次栈

3、层次调用越多,越“危险”,可能溢出

发布了131 篇原创文章 · 获赞 16 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览