数据结构——浅谈递归思想

递归简论

什么是递归?在百度百科中解释为程序调用自身的编程技巧称为递归( recursion)。在我看来,当一个函数用它自己来定义时就是递归。接下来,将用一个简单的程序来解释递归思想(Java语言描述)
如:public static int f(int x)
{
if(x==0)
return 0; //基准情况//
else
return 2f(x-1)+xx; //递归调用//
}
这是一个华氏温度转化为摄氏温度的一个简单程序,在这个程序中便应用了递归思想。
第3,4行处理基准情况,即此时的函数值可以直接算出而不使用递归。在Java中,如果没有基准情况,那么该方法是毫无意义的。
第6行执行递归调用
现在来解释递归调用的过程:如果以参数3的值调用函数 f ,那么第六行要求计算2f(2)+33,这样便要执行计算f(2)的调用,则第六行要求计算2f(1)+22,这样便要继续执行f(1)的调用,为此,通过计算 2f(0)+11而得到f(1),因此f(0)必须被赋值,由于我们在基准情况中将f(0)=0给出,那么f(1)的值便可以计算,然后f(2)f(3)的值最后都可以被计算出来。
递归调用将反复计算直至基准情况出现。

递归的两个基本法则:
1、基准情况,必须总要有某些基准的情形,他们不用递归便能求解。
2、不断推进,对于那些要求递归求解的情形,递归调用必须总能朝着一个基准情形推进。

作为非数学应用的一个例子,考虑一本大词典。词典中的词都是用其他的词定义的。当查一个单词的时候,我们不是总能理解对该词的解释,于是我们不得不再查找解释中的一些词。 同样,对这些词中的某些地方我们又不理解,因此还要继续这种查找。因为词典是有限的,所以实际上或者我们最终要查到处,明白了此处解释中所有的单词(从而理解这里的解释,并按照查找的路径回查其余的解释)或者我们发现这些解释形成一个循环,无法理解其最终含义,或者在解释中需要我们理解的某个单词不在这本词典里。
我们理解这些单词的递归策略如下:如果知道一个单词的含义, 那么就算我们成功;否则,就在词典里查找这个单词。如果我们理解对该词解释中的所有的单词,那么又算我们成功;否则,通过递归查找一些我们不认识的单词来 “算出”对该单词解释的含义。如果词典编纂得完美无瑕,那么这个过程就能够终止;如果其中一个单词没有查到或是循环定义(解释),那么这个过程则循环不定。
——2019.3.8

参考资料:
1、 递归
2、数据结构与算法分析(马克·艾伦·维斯著)

猜你喜欢

转载自blog.csdn.net/weixin_44745255/article/details/88360377