下面简单整理了下有关栈的几个应用。
把一个直接调用自己,或间接调用自己的函数,成为递归函数。
这里有一个比较好的例子,看下面一组数:
你是否发现了这组数的规律呢,没错你会发现从第三个数开始,每个数都是前面两个数的之合。
现在我们通过程序来实现这个算法,如下java代码:
public class Test { private static int dieDai(int i) { if (i < 2) { return i == 0 ? 0 : 1; } return dieDai(i - 1) + dieDai(i - 2); } public static void main(String[] args) { for (int i = 0; i < 12; i++) { System.out.println(dieDai(i)); } } }
写递归程序注意:
写递归程序最怕的就是程序陷入永无止境的递归调用,所以我们这里至少要有一个限制条件,在满足某个条件时,要返回一个结果,而不是继续调用自己本身。
其实上面的这段事例代码用迭代也能实现,你可以尝试写一下,你会发现通过迭代写出的代码,看起来特别冗余,而通过递归写出的则看起来比较清晰、简单。
迭代和递归的区别:
想见下面图文描述,递归与栈的关系。简单总结就是递归的执行顺序符合栈的存储结构。迭代使用的是循环结构,递归使用的选择结构。
递归能够让人觉得程序更清晰、简洁、容易让人理解,但是大量的递归调用会建立函数副本,会消耗大量的时间和内存,迭代则不需要反复的调用函数和占用额外的内存。
后缀表示法具体计算方式,我直接把树上的截图附上,很直观明了
原文地址:http://blog.csdn.net/gaopeng0071/article/details/24599943