递归
栈有一个很重要的应用:在程序设计语言中实现了递归。那什么是递归呢?
当你往镜子前面一站,镜子里面有你一个像。那如果两面镜子一起照呢?那么两面镜子里面都会产生千千万个就会产生你,这就产生了递归现象。
就像上面这张专辑图片的左上角一样。
递归的一个典型例子
斐波那契数列的实现 --
那什么是斐波那契数列呢 ??
看这一个数列:
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
值 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
可以看出:数列的前面相邻两项之和,构成下一项,这是就是那什么是斐波那契数列。
我们采用两种方法实现打印前20位斐波那契数列的列数- -迭代+递归
迭代
1 int i;
2 int array[] = new int[20];
3 array[0] = 1;
4 array[1] = 1;
5 System.out.print(array[0] + " " + array[1] + " ");
6
7 for (i = 2; i < 20; i++) {
8 array[i] = array[i - 1] + array[i - 2];
9 System.out.print(array[i] + " ");
10 }
递归:
int i;
for (i = 0; i < 20; i++)
System.out.println(Fbi(i));
static int Fbi(int i) {
if (i < 2)
return 1;
return Fbi(i - 1) + Fbi(i - 2); // 这里Fbi函数就是自己,它在调用自己
}
递归和迭代的区别:
1、迭代使用的是循环结构,递归是循环结构。
2、递归能使程序的结构更加清晰,更简洁,更容易让人理解,从而减少读代码的时间。
3、但是大量的递归调用会建立函数副本,会耗费大量的时间和内存。
4、迭代则不需要反复的调用函数和占用额外的内存,因此我们应该视不同情况使用不同的实现方式。
再补充一个栈的其他应用(进制转换)
如10进制转换成8进制,除8求余,并且余数进栈。
出栈的元素即是8进制数。
1 public static void conversion(int n) {
2 LinkStack stack = new LinkStack();
3 while (n != 0) {
4 stack.PushStack(stack, n);
5 n /= 8;
6 }
7
8 while (!stack.ElemptyStack(stack)) {
9 stack.PopStack(stack);
10 }
11 }
完毕 - -