算法-递归思想
2016-12-01 17:41
232 查看
递归
如果想使用递归算法解决问题:那么此问题必须满足 f(X)=nf(x); 能把f(X)转化为f(x) - 转化为若干个相同的子问题
解决思路:
1.找出递归公式2.找出递归终止条件
问:求n的阶乘
分析:
n的阶乘为 n*(n-1)*(n-2)…*1
也就是:nf(x)—— 若干个子问题
终止条件 :*1
//时间复杂度O(n) function recursion(n){ if(n==0){//终止条件 return 1; }else{ return n*recursion(n-1); } } console.log(recursion(5));
循环方式实现:
function itordinary(n){ var iNums=1; for(var i=1;i<n;i++){ iNums=iNums*(i+1); } return iNums; } console.log(itordinary(5));
总结:
递归算法:优点:代码简洁、清晰,并且容易验证正确性。
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
大神分析:
(1)递归都可以改成循环。这个命题如何评价?(厉害了 word哥)
我先说下结论,就是,这个命题是成立的,但是,如果只看到这个结论,对问题的认识则是片面的,不完整的。
也就是说,只看到了递归和循环的共同点:都是 EIP 在同一段代码段内反复。
而没有注意到两者在模型,重复代码段之间的层次结构,和流程控制方面的差异。
但是,它忽略了另一个层面,就是递归和循环的思维模型上的差异性。
我先打个比喻,递归是自相似的,就好比分形图,两次重复代码段之间,是有结构,层次上的“父子”关系的。
我用鼠标手绘了一个草图,不是那么完美,感受一下就好(下图是主观感受示意,可能不太严谨的):
而循环呢,思维模型里,它是每层循环是在一个维度上的。
递归在重复的代码片段内,每一层,都有自己独立的一套上下文。在堆叠。
循环,是在同一个层次之内的。
所以,由于这种模型上并不是完全匹配,所以虽然可以相互转换,但是实际上算法内部是有一定的“重新加工”的过程。
终极总结:
递归思维模型: 是有多层维度的,每一层,都有自己独立的一套上下文。在堆叠。,两次重复代码段之间,具有结构,层次上的“父子”关系的。(这个就是递归思想 oh my god)循环思维模型: 只是在一个维度上,公用一套上下文,两次重复代码段之间,具有结构,层次上的”兄弟”关系的
相关文章推荐
- 基于递归思想的组合、H变换等几个算法实现
- 算法——递归思想解决排列组合问题
- 算法之递归思想
- 利用分治思想,写一个求解从n个元素里选取m个有多少种组合方案的(非递归)高性能算法
- 递归和分治思想1 - 数据结构和算法31
- 递归和分治思想1 - 数据结构和算法31
- 递归和分治思想3|汉诺塔 – 数据结构和算法33
- 算法——递归思想解决排列组合问题
- 递归和分治思想4|八皇后问题 – 数据结构和算法34
- 常用算法思想之:递归思想
- 程序算法艺术与实践:递归策略基本的思想
- 基础算法思想_递归——斐波那契数列
- 细谈递归,备忘录递归,动态规划,三种算法思想和运行原理
- 常用算法思想复习之<递归与分治>
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- 【数据结构与算法】深入浅出递归和迭代的通用转换思想
- 递归是一种算法结构,回溯是一种算法思想
- 求二维平面最近点对算法; 分治思想; 递归写的好精准,模仿ACM模板写的.;很多细节处理的很漂亮;
- 【数据结构与算法】深入浅出递归和迭代的通用转换思想