【从 0 到 1 学算法】2. 递归
两种输入输出方式的区别
printf 和 scanf,稍微写起来有点长,但速度巨快
out,稍微写的短一点,但速度稍慢
如果输入输出总数小于 10^5,两者没什么区别,我们经常用 cin 和 cout 来加快写输入输出时间,如果大于则选 printf 和 scanf,避免超时
递归
递归搜索树
结论:所有递归问题如果不是很明白,都可以用一个方法来解决,那就是画出题目其中一个案例的递归搜索树,把复杂问题变成图像问题,更方便去解决抽象问题,通过一个案例图像就可以联想其他案例的解决方法
根据斐波那契数列的定义,来推到出 6 的斐波那契值,因为 f(n) = f(n-1) + f(n-2),f(1) = 1,f(2) = 2,这几个条件可以推出任意一个数的斐波那契值,算到 f(1)和 f(2)的时候,就要往前回溯值,遇到同一个节点就要相加,直到达到最后一个夫节点算是这个数的斐波那契值为止,由此我们可以写出斐波那契数列的代码形式
简单来说就是函数自己调用自己的过程
一些常用的数学知识
2^1 到 2^10 需要知道分别是 2,4,8,16,32,64,128,256,512,1024
2^20 约等于为 10^6
2^16 是 65536
2^15 是 32768
2^6 约等于 10^18
经典递归题讲解
先画出其中一种情况的递归搜索树的图,便于理解,进而写出代码
题解:我们默认第一个位置是 1,进入 dfs 函数时,先判断是否达到结束条件,如果满足结束条件则输出对应满足条件的值,达到第一个分支时,是该位置不选的情况进行赋值,然后进入下一个位置再继续判断,为了不让子树去影响父树,所以要将该位置恢复到赋值前的状态,这样下一个位置进行判断赋值的时候就不会收到影响了,接着达到第二个分支,是该位置选的情况进行赋值,接下来的过程跟不选的情况是一样的
版权声明: 本文为 InfoQ 作者【Geek_65222d】的原创文章。
原文链接:【http://xie.infoq.cn/article/434e389dff3e17087e19afa1f】。未经作者许可,禁止转载。
评论