递归的理解

事实上,我们并不是每个函数都需要跟进去看执行结果的,比如我们在自己的函数中调用printf函数时,并没有钻进去看它是怎么打印的,因为我们相信它能完成打印工作。

如果你相信你正在写的递归函数是正确的,并调用它,然后在此基础上写完这个递归函数,那么它就会是正确的,从而值得你相信它正确。

以上两句话就是要明白一个道理:不要把自己放进递归函数中,放进一些简单的递归如阶乘,可能你还能理解,但是换个求全排列这样复杂点的递归函数你可能就懵逼了。你要站在一个上帝视角去看待问题,就像走迷宫,你不知道正确的路线就往里面走,那么你一定会迷路的,但是如果我站在高处的地方把正确的路线找到了,那我走迷宫的时候就不会迷路了。所以不要主观的看待,客观的把它当做一个人,你交给他的任务他一定能够完成的,你也千万别替他安排任务该如何去完成。

 

 

递归算法概念是函数调用自己来实现的某种功能,按以下方法理解递归你会恍然大悟(如果你对递归有疑惑的话),并觉得递归是如此简单:

1.递归是高中数学中的数列那一章讲的内容。数列这章讲了一个概念叫递推公式:如果已知数列的第1项(或前几 项),且从第二项(或某一项)开始的任一An与它的前一项An-1(或前几项)间的关系可以用一个公式来表 示,那么这个公式就叫递推公式,递推公式是给出数列的一种方法。

2.例如斐波那契数列的递推公式就是:An=An-1+An-2(n>2,a1=1,a2=1)

3.那么现在如果想用递归的方式表示斐波那契数列即可定义函数f(n):当n>2时f(n)=f(n-1)+f(n-2);当n=1时f(n)=1,当n=2时f(n)=1;

即private static int fibonacciRe(int i) {
if(i == 1 || i == 2)
return 1;
else if(i>2)
return fibonacciRe(i-1)+fibonacciRe(i-2);
else 
return 0;
}

4.解释:其实说白了递归函数就是一个递推公式,只要递推公式往纸上一写,把项A替换成函数名字,把n替换成函的 参数即可,最后用if处理一下特殊参数值时的结果值就欧了。

5.总结:我们为什么有些人很难理解递归函数呢,我个人觉得是我们在学计算机语言的时候都是在大学里学的,然后 此时的高中数学知识已经忘却了,取而代之的是我们把我们的大脑陷在了递归方法调用的过程中了,比如,要一 步步该怎么调用了。如果我们要结合高中数学中的这个概念的话就一点也不难理解递归,反倒觉得递归的算法一 眼看去就很明白,我个人以前难于理解递归是因为只要我看到了递归我的脑子就在循环的一层层的往下继续调 用,觉得很难理解,其实我们完全不要去想那一层层的调用关系,反而想到递归就把他抽象出来一个递推公式, 这样你就会恍然大悟的感觉,原来递归如此简单。我们以前不好理解递归是我们自己的给自己制造了理解它的障 碍。觉得理解这个就跟用眼在电脑上看懂三维立体画有异曲同工之妙。现在如果只要给你在纸上写出了一个 递推公式,你立马就可以用递归函数写出来。呵呵。。递归是不是很简单呢?!其实我们的计算机算法都来源于 数学,计算机算法是数学应用于生产的很好的一个例子!

6.附:斐波那契数列的非递归算法,由于递归很耗资源,所以不到迫不得已尽量不要用递归算法

posted @ 2019-08-28 14:08  高颖1995  阅读(507)  评论(0编辑  收藏  举报