一、递归和循环的关系
1、 递归的定义
顺序执行、循环和跳转是冯·诺依曼计算机体 系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世 界。递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可 以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构。因为递归方法会直接或间接 调用自身算法,因此是一种比迭代循环更强大的循环结构。
2、 递归和循环实现的差异
循 环(迭代循环)结构通常用在线性问题的求解,比如多项式求和,为某一结果的精度进行的线性迭代等等 。一个典型的循环结构通常包含四个组成部分:初始化部分,循环条件部分,循环体部分以及迭代部分。 以下代码就是用循环结构求解阶乘的例子:
86 /*循环算法计算小数字的阶乘, 0 <= n < 10 */ 87 int CalcFactorial(int n) 88 { 89 int result = 1; 90 91 int i; 92 for(i = 1; i <= n; i++) 93 { 94 result = result * i; 95 } 96 97 return result; 98 }
递归方法通常分为两个部分:递归关系和递归终止条件(最小问题的解)。递归方法的关 键是确定递归定义和递归终止条件,递归定义就是对问题分解,是指向递归终止条件转化的规则,而递归 终止条件通常就是得出最小问题的解。递归结构与人类解决问题的方式类似,算法简洁且易于理解,用较 少的步骤就能描述解题的全过程。递归方法的结构中还隐含了一个步骤,就是“回溯”,对于需要“先进 后出”结构进行操作时,使用递归方法会更高效。以下代码就是用递归方法求解阶乘的例子:
100 /*递归算法计算小数字的阶乘, 0 <= n < 10 */ 101 int CalcFactorial(int n) 102 { 103 if(n == 0) /*最小问题的解,也就是递归终止条件*/ 104 return 1; 105 106 return n * CalcFactorial(n - 1); /*递归定义*/ 107 }
从上面两个例子可以看出:递归结构算法代码结构简洁清晰,可读性强,非常符合“代码 就是文档”的软件设计哲学。但是递归方法的缺点也很明显:运行效率低,对存储空间的占用也比迭代循 环方法多。递归方法通过嵌套调用自身达到循环的目的,函数调用引起的参数入栈等开销会降低算法效率 ,同样,对存储空间的占用也体现在入栈参数以及局部变量所占用的栈空间。正因为这两点,递归方法的 应用以及解题的规模都受系统任务或线程栈空间大小的影响,在一些嵌入式系统中,任务或线程的栈空间 只有几千个字节,在设计算法上要慎用递归结构算法,否则很容易导致栈溢出而系统崩溃。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据结构算法
, 递归
, 结构
, 递归算法
, 循环
, 死循环?求解
, 循环问题
, 迭代
, c语言问题 新手求解
, 算法 递归 数据结构
, 阶乘
, 阶乘 算法
, 递归 循环
递归数据结构
循环赛日程表递归算法、java for循环递归算法、递归算法、递归算法经典实例、汉诺塔递归算法,以便于您获取更多的相关知识。