走进递归的世界
2016-11-14 23:36
218 查看
走进递归的世界
从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚正在给小和尚讲故事。从前有座山......这里就存在方法定义中调用函数方法本身的现象。递归分两步,递和归。它会消耗很多堆栈空间和函数调用时间,因为递归可以产生无限的循环体,每一次它的返回值会占用一定得空间一.递归需要满足的条件
并不是所有问题都可以用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件:
l 可以通过递归调用缩小问题规模,并且旧问题和新问题有着相同的形式
l 存在一种可以退出的情况
二. 递归的原理
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。而递归算法的一般形式为:
function func(num){
if(endCondition){
constExpression //基本项
} else {
accumrateExpreesion //归纳项
num = expression //步进表达式
func(num) //调用函数本身
}
}
递归不仅是“自己调用自己”,还可以交互调用的递归,它更多的是一种分析和解决问题的方法和思想。递归的思想是:“把问题分解成为规模更小的,具有与原问题有着相同解法的问题。”
曾看到一个大神对递归的解释是这样的:”古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。“ 对于递归的优化可以用到尾递归来进行优化。
并不是所有问题都能用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件:
四.递归列子
4.1斐波那契数列。兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
function fac(n){
if(n==1||n==2){
return 1;
}
return fac(n-1)+fib(n-2);
}
4.2 阶乘。一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。
function factorial(n){
if(n == 1){
return 1;
}
return n * factorial(n- 1)
相关文章推荐
- 带你走进服务器的世界看个明白
- LCD知识充电讲堂:走进神奇的Gamma世界
- 走进Run Loop的世界 (一):什么是Run Loop?
- 深入探索 Kdump,第 1 部分:带你走进 Kdump 的世界
- 走进异步编程的世界 - 开始接触 async/await
- 带你走进rsync的世界
- 走进小作坊(七)----谷歌是如何控制世界的
- 小丁带你走进git世界五-远程仓库
- 带你走进缓存世界(3):缓存原理
- 阿里的27个项目资源带你走进Github世界
- 【走进Lua的世界之五】C++调用Lua函数
- 思维导图,带你走进《西游记》人物的世界
- 走进C++程序世界-------强制数据类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)
- LCD知识充电讲堂:走进神奇的Gamma世界
- 带你走进多线程的世界(多线程实现方式)
- 带领我们一起走进PHP的世界
- 走进windows编程的世界-----窗体的注冊及创建
- 详解C++引用——带你走进引用的世界
- 走进嵌入式 Linux 的世界
- 走进异步世界:博客程序的异步化改造以及发布后的不理想情况