递归就是自己呼叫自己。
首先,您需要弄清楚函数是如何调用的。 在执行调优的函数之前,系统必须执行三件事。
1 .将自变量、函数的返回地址等信息传递给被调函数进行保存。
2 .局部变量为函数被删除的参数分配空间
3 .将控制转移到被调函数的入口。
从被调函数返回之前,也需要做三件事。
1 .保存函数返回结果
2 .释放被调制函数的存储空间
3 .根据被调函数中保存的返回地址,将控制转移到调用函数。
其中主调函数和被调函数之间的参数传递和控制转移通过栈实现,计算机只能操作栈顶元素。 调用下降函数时,堆栈下降函数的数据空间会将控制权转移给下降函数。函数结束后,被调制函数被堆栈,控制权再次返回主调函数。
由此可见,计算机程序调用另一个程序和调用自己没有区别,同样也在做上述事情。
与常见的迭代相比,递归具有以下特征:
1 .递归与人的“逆向思维”相近,但反复不用脑子直接进行。
2 .由于手续的复杂性,递归短,迭代长。
3 .在执行效率方面,递归效率较低,函数调用会做很多事情,所以迭代效率高。
4 .程序有错误时,容易发现反复的错误,但递归的错误很难发现。
到底什么时候使用递归,什么时候使用迭代呢? 如果你不想用一点自己的脑子,让计算机更累,你可以自己考虑使用递归的每一步,如果计算机想直接执行,你可以使用迭代。
其实,并不是所有的问题都可以转化为递归问题。 使用递归分析问题时,必须保证使用递归后问题的本质没有发生变化。 但是,当规模变小,且规模缩小到一定程度时,我就能解开他。
To iterate is human,torecursedivine.—— l.Peter Deutsch
迭代是人,递归是神。