递归用法

前段时间有个刚学编程的人找我做了几道编程题,都用到了递归,让我写个使用递归的总结,我个人用到的递归不多,就这几道编程题总结如下,后期如有新的体会再补充。

适用点

想一下规模为n的问题是否可以经过计算换算成规模为n-1的问题,如阶乘计算,n!=n*(n-1)!,这时就可以用递归。使用递归主要是代码写起来比较方便,大多数情况使用栈和循环都可以替代使用递归。

注意点

写递归算法时,要最先思考边界值,就是递归算法在什么情况下不应该再递归下去,如对于阶乘问题的n为1、0的时候,防止出现死循环。

优化点

用递归算法去解决问题,经常会比较耗性能,因为进行了大量循环,多进行一次递归可能会进行很多次循环,所以控制在哪些条件下无需递归很容易优化性能,如递归求最短路径时,如果当前递归处理的路径长度已经超过了当前最短路径的长度,那就不用再向下递归了。还要会利用数据结构,比如Map能够快速取值,如果是数组取值时需要进行遍历,尽量减少循环的次数。

调试点

递归问题最大的难点可能就在调试上了,因为进行了很多循环,无法跟进每一个循环去看当前的值对不对。这时一定要将问题范围缩小,比如题目要求100个点,可以先拿10个以内的点去调试,这时可以通过断点调试跟进每一次循环,看到所有变量当前的值,这样就容易看出问题出在哪了。如果有问题的标准答案,还要会利用答案,如果解题需要大量循环无法跟进时,可以写一个if条件在满足正确答案时进行输出,也可以在这里打个断点,看看为什么没有获得这个标准的答案,这时比较容易看出问题。

以上都是我做那几个题时的思路和方法,以前我也就写过一两次递归,其实没什么经验,大多数方法都是以前调程序的经验。如果打算深入的往编程这方面发展,有如下建议:

1、要进行编程练习,就像递归,完全自己手动去解决两三个问题也就会用了,也有调试的经验了;
2、一定要会分析问题,拆分问题,这个问题分几步,每一步都做什么,这样比较容易写出程序,容易调试,容易定位问题出在哪步了,其它地方就不用看了,也方便解决问题,问题细化后就容易描述小问题了,可以上网找找现成的例子;
3、一定要会分析现象,现在程序运行的结果不对,是什么样的现象,这个现象表明什么本质,切记不要直接一遍一遍的看代码,找哪里不对,这样很难找到问题的,如果你知道这样写有问题,那当时也就不会这样写了,一定要仔细思考、分析现象,找到问题本质,然后定位有问题的代码范围,再看代码。