栈的应用---递归

递归

栈有一个很重要的应用:在程序设计语言中实现了递归。那什么是递归呢?

当你往镜子前面一站,镜子里面有你一个像。那如果两面镜子一起照呢?那么两面镜子里面都会产生千千万个就会产生你,这就产生了递归现象。

就像上面这张专辑图片的左上角一样。

递归的一个典型例子

斐波那契数列的实现 -- 

那什么是斐波那契数列呢 ??

看这一个数列:

下标 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     }

完毕 - -

 

posted @ 2019-01-23 13:33  四季列车  阅读(959)  评论(0编辑  收藏  举报