算法系列之十五:循环和递归在算法中的应用

本文探讨了递归和循环的关系,指出递归是特殊形式的循环,但可能导致运行效率低和栈空间占用增加。通过阶乘计算的例子对比了两者实现的差异,并举出滥用递归导致栈溢出的问题。接着,通过24点游戏和单链表逆序问题,展示了在不同场景下选择递归或循环的优势,强调应根据问题类型和规模灵活选择算法。
摘要由CSDN通过智能技术生成

一、递归和循环的关系

 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 }

         从上面两个例子可以看出:递归结构算法代码结构简洁清晰,可读性强,非常符合“代码就是文档”的软件设计哲学。但是递归方法的缺点也很明显:运行效率低,对存储空间的占用也比迭代循环方法多。递归方法通过嵌套调用自身达到循环的目的,函数调用引起的参数入栈等开销会降低算法效率,同样,对存储空间的占用也体现在入栈参数以及局部变量所占用的栈空间。正因为这两点,递归方法的应用以及解题的规模都受系统任务或线程栈空间大小的影响,在一些嵌入式系统中,任务或线程的栈空间只有几千个字节,在设计算法上要慎用递归结构算法,否则很容易导致栈溢出而系统崩溃。

 3、 滥用递归的一个例子

         关于使用递归方法导致栈溢出的例子有很多,网上流传一个判断积偶数的例子,本人已经不记得具体内容了,只记得大致是这样的:

  115 /*从网上摘抄的某人写的判断积偶数的代码,使用了递归算法*/

  116 bool IsEvenNumber(int n)

  117 {

  118     if(n >= 2)

  119         return IsEvenNumber

  • 21
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹泡泡的小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值