对递归的理解【笔录】

    数据结构和算法的学习,最难掌握的有两个,一个是动态规划,另一个则是递归。

    实际工程中递归的应用非常广泛,也是开发者经常被考察的重点。

  • 1.理解“递归”

    有这样一个场景,假设你在排队,前面排了很多人,但不知道自己排的是第几(每个人都不知道自己是第几名,除了第一个知道自己是第一名)。当你想知道你排第几的时候怎么做?当然你可以从第一个开始数(遍历一遍),还有一种方案就是偷懒的做法,你问你前面的人是第几名,你前面的人再问他前面的人......直到问到第一个人为止,然后再从前往后告知(每个人的名次都是前面的加1),到你自己你就知道自己是第几名。这不就是“递归”的思想吗?

   上面的例子中,从后往前问排第几体现在“”这个字,即一步一步往前递推;而回来告知结果体现在“”。用递推公式表示为:

     f(n) = f(n-1) + 1;其中 f(1) = 1。

用代码写出来为:

int f(int n)
{
    if(n == 1)
     return 1;
    else
     return f(n-1) + 1;
}
  • 2.递归的三要素

      (1)问题可分解为子问题

      (2)子问题的解决思路完全一致

      (3)存在终止条件

从这三个条件与上面排队的例子可以找到对应的关系。

  • 3.怎么写递归代码

       关键在于找到递推公式和终止条件

  • 4.递归难理解在哪?

  难在考虑递归过程的时候总会去想递归一层一层的调用,想着想着就乱了,其实这是计算机的思维方式,因为计算机的优势就是能存储每次递归的状态,即堆栈,而人并不能记忆那么多东西。所以,考虑递归的时候只需要通过递推公式和终止条件去推敲,不需要考虑每层的关系。

  • 5.递归注意的事项

   (1)防止递归过深----有堆栈溢出的风险

   (2)防止重复计算----消耗资源

  • 6.递归程序怎么调试

    (1)打印日志

    (2)添加条件和断点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值