其实以前都特别的不理解递归,看到别人在解决复杂问题时,总是通过几行代码就解决了,心理很纳闷。
最后分析了一下递归代码,才知道了递归的奥妙所在。下面我写一个程序来分析一下。
int sum(n)
{
if(1==n)
return 1;
else
return sum(n-1)+n;
}
这个函数是求1+2+3+....+n的和,当n=3时,会返回sum(2)+3,那实际上sum(2)+3=sum(1)+2+3=1+2+3=6;
那这就是这个程序的执行过程,在计算机中会通过return 语句将函数的结果返回给这个函数,所以才有了我们递归的实现。
实际上我们分析的过程也就是计算机一步一步的做的过程,我们使用递归函数写代码可以使函数代码看起来很简单,但也确实需要我们理解,只有我们理解了一个问题是怎样的,我们才能设计出递归函数,从上面的代码可以看出,要写递归函数必须要有一个出口,就比如是我们上面的n=1时,这个函数的值是1.
递归是通过调用它自身来解决问题的,也就是它自己,即一个函数。所以这个过程需要在栈上开辟大量的空间,当n的值较小时还好,若大,则会早造成我们的栈溢出,即栈的内存空间不够用了。这也是递归的缺陷。
所以综上,递归会使代码量减少,减少编写人员的负担,但同时也会加重栈内存。当n较小时,它和一般函数的效率基本相差不大,但当n很大时,递归的效率则会非常低。