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