在计算机这个行业,特别是做算法的萌新们,在学习算法或者程序设计时都会遇到一个问题,那就是递归。对于递归,再书上通常就是这样一句话,程序或者方法自己调用自己。萌新们的问题可能就出在这句话上了,那么究竟什么叫做自己调用自己呢?这怎么个调用的方式呢?是把自己所有的代码再跑一次还是什么呢?其实,要回答这几个问题就要想明白这种调用对应什么结构,然后有了清晰的结构自然就能够明白这句话的具体内涵是什么了。
为了找到这种结构,不妨构造一个代码段如下:
function(parameters)
{
if 退出条件 return
function(subparameters1)
function(subparameters2)
……
function(subparametersn)
}
那么这段代码怎么运行的呢?假设仅仅递归2次,在这里将递归的代码展开就有如下的形式
function(subparameters2)
{
function(parameters)
{
if 退出条件 return
function(subparameters1)
{
if 退出条件 return function(subparameters2){
if 退出条件 return ……{
function(subparametersn){
if 退出条件 return { }
}
}
}
}
}
上面写了一堆的“{}”可能把你绕晕了,现在咱们就一起来从上面这个代码的括号结构来寻找我们要的结构,看看这一层一层的括号似乎和Windows的文件夹一层层的打开方式类似,是的你没有看错的确是这样。就像你在打开电脑在不同的文件夹内溜达,结果到底了还是没有找到你想要的东东,(这儿假如你我们没有意见回到根目录的快捷方式),那么,你是不是得一层一层的回到上一层目录呢?是的就是这样。你会说,废话这和递归有啥关系呀?好亲们,我们看看上面我粘贴的一堆的括号是不是和我们找东西的时候没找到回到根目录类似呢?对的,你真聪明,的确是这样的。那么想一想,Windows的的文件是按照什么结构组织的呢?对的是树形结构。好找到这个结构有兴趣的同志们在次体会一下递归吧!
(欢迎留言批评指正!)