代码改变世界

数据结构与算法回顾之递归

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。