千峰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、层次调用越多,越“危险”,可能溢出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值