数据结构与算法回顾之递归
2010-12-11 20:22 yearN 阅读(252) 评论(0) 编辑 收藏 举报在编程语言中,把直接或间接地调用自身的函数称为递归函数。函数的构建通常需要一个函数或者一个过程来完成。
下面我们来看看几种容易被遗忘的递归形式:
1. 尾递归
仅在方法实现的末尾进行一次递归调用。换句话说,当进行调用时,方法的后面已经没有要执行的语句。递归调用不仅是最后一条语句,而且前面也没有直接的或间接的递归调用。
例如一个尾递归方法是这样的:
void Tail(int i) { if(i>0) Console.WriteLine( “i is ”+i); Tail(i-1); }
下面这个方法 NonTail()不是尾递归:
void NonTail(int i) { NonTail(i-1); Console.WriteLine(“i is ”+i); NonTail(i-1); }
2. 间接递归
间接递归的形式是这样的:方法f()可以通过一串调用间接调用它自身。
例如:f()可以调用g(),g()又可以调用f()。
这个调用中间可以有任意多个调用,如:
f()->f1()->f2()->…->fn()->f()
3.嵌套递归
如:一个嵌套递归函数,这个函数不仅用它自身定义,而且还将它自己作为一个参数。
例如:
0 n=0
h(n)= n n>4
h(2+h(2n)) n<=4
4. 过分递归
逻辑简单性和可读性是支持递归使用的基础。递归的代价是拖长了运行时间并且
相对于非递归方法,它占用了更多的运行时堆栈空间。如果递归层次太深(例如:
计算5.6的100000次方),那么运行会导致堆栈溢出,并且程序会不正常结束,产生
一个不可恢复的错误StackOverflowError。