递归思想关注的是与当前步骤有关的上一步和下一步的关系,它不关注整体。
如何发现规律?
观察
逆推
重复
递归算法总是给人一种似懂非懂的感觉,因为你只清楚了当前该怎么做,但是你不知道算法运作的全貌,而想知道全貌却是很麻烦的一件事。
递归转换成非递归的通用方法
1、确定递归体。
2、入口递归体出栈。
3、被调用递归体逆序入栈。
实质
递归调用的内存过程是不断地入栈和出栈操作,该通用方法是模拟内存的操作而已。递归调用的全过程展开以后是树,一般来说是完全树,并不局限于完全二叉树,也可能是完全一叉树、完全三叉树、……完全n叉树,当然,也可以是普通的n叉树。递归的全部过程实际上是对这棵树的中序遍历,对于除二叉树以外的其他树可以理解为类中序遍历。
就单次遍历而言,它是与对树的深度遍历过程相似的过程。每次入栈或者出栈的过程中涉及到的结点数量并不是全部,最多是……,假如是n叉树,深度为k的话,那么最多需要n×(k-1)+1个单元。
之所以入栈的时候要逆序书写,是因为栈就是先进后出表,你要想得到正序的序列,那么输入就应该是逆序的。因为递归程序的顺序是按照人的正常思路来的,所以它是正序的。
名词解释
现在以汉诺塔问题为例解释一下