递归虽然有许多诸如解决复杂问题(有些问题必须用递归才能解决)、缩短程序代码、提高编程效率等优点,但是它也有许多致命的弱点。
可以想象,递归调用的过程可能象一个无底深渊,永远不能返回。我们知道函数在调用另一个函数时,需要把原来的函数的局部变量、返回地址等压入堆栈(即所谓的保留现场),以达到正常返回和继续执行。在一个函数进行递归调用时,每一次调用它本身,就象调用一个新的函数一样,他的所有的局部变量都要在内存中保留一份(即压栈),如果递归调用地层次过多甚至无休止的进行递归调用,将耗尽系统资源(栈满),出现“堆栈溢出错误”。因此无意识的使用递归是极易出错的。
我们了解了递归的特点之后,要避免这些问题并不是很困难的,关键要注意以下两点:
1.为防止递归的无休止调用,在递归函数中要及时返回,这就是结束条件的作用。我们应当看到,在所有的递归函数中都有一个终止递归的条件判断。
2.递归函数可以简化程序,但一般不能提高程序的执行效率。直接递归函数要不断的调用自身,而间接递归会调用两个或更多的函数,这样对内存的占用是相当巨大的,因才在递归函数中应尽量少用局部变量。