算法设计 -- 递归
来源:互联网 发布:钱龙分析软件 编辑:程序博客网 时间:2024/06/05 01:18
递归概念
递归,是程序自己直接或者间接调用自己。
作用:
1. 把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
2. 减少程序代码量。
3. 容易阅读。
递归条件
构成递归需具备的条件:(摘自 :百度百科)
1. 子问题须与原始问题为同样的事,且更为简单;【化简原则】
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。【终止原则】
递归应用场景
递归算法一般用于解决三类问题(摘自 :百度百科):
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
(3)数据的结构形式是按递归定义的。
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
图论:
树,图的遍历。
数学:
Fib(n) = (Fib(n-1) + Fib(n-2))
递归需要的关键部件
1. 边界条件 :对应前面提到的【终止原则】。(是控制前进,后退的 开关)
2. 递归前进段 : 体现了分解问题的过程。
3. 递归返回段 :小问题解决,支援大问题的过程。
代码实例:
阶乘
n! = n * (n-1) * (n-2) * …* 1(n>0)
相关说明:
1. 从中可以看出递归的各个组件。
2. 边界条件 丢失,导入程序无法终止。
3. 递归后退段没有,导致无法使用小问题解决大问题。
4. 递归前进段丢失,则 大问题无法进行分解。
5. 一次递归所含的工作量:下面这段代码,一次递归中只进行一次乘法运算,这从某种程度上来说,是对于递归的一种浪费。(因为入栈,出栈时间要多的多)
6. 递归灾难: 如果有1亿个数,那么这种做法递归层次将会达到1亿次。【所以为每次的递归合理分配工作量也是很重要的,确定一次递归处理单元的粒度】
int recursive(int i){ int sum = 0; if (0 == i) //1.终止条件 return (1);//2.递归后退段。 else sum = i * recursive(i-1);//3.递归前进段 return sum;//2.递归后退段}
- 算法设计方法 - 递归
- 递归算法设计
- 算法设计 -- 递归
- 用递归算法设计函数
- 用递归算法设计函数
- 常用算法设计方法之递归
- 算法设计之递归法(2)
- 常用算法设计方法(四) --- 递归
- 关于递归算法设计的思考
- 递归算法的证明与设计
- java、装饰设计模式与递归算法
- 第5章 递归算法设计
- 算法设计与分析-递归算法总结
- 算法分析与设计-01-Fibonacci数列的递归算法
- 算法分析与设计-02-勒让德多项式的递归算法
- 算法设计与分析 Ackerman函数的递归实现算法
- 算法设计与分析 全排列的递归实现算法
- 算法设计与分析 整数划分的递归实现算法
- LightOJ1197【数学】
- 程序界面的编写--使用Xml文件进行界面的编写
- RecylerView的用法解析
- Codeforces Round #375 (Div. 2) -- E. One-Way Reform(dfs求欧拉回路)
- asa hacker
- 算法设计 -- 递归
- 浙大PTA 4-3
- Java接口中的成员变量为什么必须是public static final?
- 浙大PTA 4-2
- 用C++自制的源码统计工具
- Linux工具CRT的安装
- Two Stacks In One Array
- Day 28:Fail to get up
- Docker Common Commands