• 博金
    2018-10-12
    调试递归:
    1.打印日志发现,递归值。
    2.结合条件断点进行调试。

    作者回复: 答案正确 大家可以把这一条顶上去

     8
     1474
  • 刘強
    2018-10-12
    那个陷入思维误区的说法产生共鸣了,原来总以为自己脑容量不足,看来牛人也一样。
     11
     437
  • 一步
    2018-10-12
    哈哈,在电影院看是第几排,我直接看电影票,直接用索引找到了

    作者回复: 哈哈😄

     9
     218
  • 姜威
    2018-10-12
    总结

    一、什么是递归?

    1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。
    2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。
    3.基本上,所有的递归问题都可以用递推公式来表示,比如
    f(n) = f(n-1) + 1;
    f(n) = f(n-1) + f(n-2);
    f(n)=n*f(n-1);

    二、为什么使用递归?递归的优缺点?

    1.优点:代码的表达力很强,写起来简洁。
    2.缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。

    三、什么样的问题可以用递归解决呢?

    一个问题只要同时满足以下3个条件,就可以用递归来解决:
    1.问题的解可以分解为几个子问题的解。何为子问题?就是数据规模更小的问题。
    2.问题与子问题,除了数据规模不同,求解思路完全一样
    3.存在递归终止条件

    四、如何实现递归?

    1.递归代码编写
    写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。
    2.递归代码理解
    对于递归代码,若试图想清楚整个递和归的过程,实际上是进入了一个思维误区。
    那该如何理解递归代码呢?如果一个问题A可以分解为若干个子问题B、C、D,你可以假设子问题B、C、D已经解决。而且,你只需要思考问题A与子问题B、C、D两层之间的关系即可,不需要一层层往下思考子问题与子子问题,子子问题与子子子问题之间的关系。屏蔽掉递归细节,这样子理解起来就简单多了。
    因此,理解递归代码,就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。

    五、递归常见问题及解决方案

    1.警惕堆栈溢出:可以声明一个全局变量来控制递归的深度,从而避免堆栈溢出。
    2.警惕重复计算:通过某种数据结构来保存已经求解过的值,从而避免重复计算。

    六、如何将递归改写为非递归代码?

    笼统的讲,所有的递归代码都可以改写为迭代循环的非递归写法。如何做?抽象出递推公式、初始值和边界条件,然后用迭代循环实现。
    展开
     6
     145
  • 范柏柏
    2018-10-12
    希望老师多分享一些经典习题。比如链表那一章课后所说的,掌握这几道题就基本掌握了链表。
     1
     131
  • 柠檬C
    2018-10-12
    递归和数学归纳法非常像,所以可以利用数学归纳法的思路,先验证边界条件,再假设n-1的情况正确,思考n和n-1的关系写出递推公式
     4
     77
  • 涛
    2018-10-12
    终于在认知层面得到了提升,递归是什么,在我看来递归就是用栈的数据结构,加上一个简单的逻辑算法实现了业务功能。

    作者回复: 👍

     1
     60
  • 失火的夏天
    2018-10-12
    检测环可以构造一个set集合或者散列表(下面都叫散列表吧,为了方便)。每次获取到上层推荐人就去散列表里先查,没有查到的话就加入,如果存在则表示存在环了。当然,每一次查询都是一个自己的散列表,不能共用。不过这样请求量大的话,会不会造成内存空间开辟太多?这里老师能帮忙解答一下吗?

    作者回复: 你这种办法可行的 👍。实际情况 内存也不会耗太多

     4
     42
  • mj
    2018-10-12
    我对台阶问题的理解是:到达n阶只可能来自n-1和n-2,所以f(n)=f(n-1)+f(n-2)

    作者回复: 你理解的也对

     3
     40
  • 一步
    2018-10-12
    说的对的,每次写递归代码,或者看递归代码,都会不自觉的在大脑中复现整个递和归的过程
    
     30
  • zl
    2018-10-12
    Debug不行就打日志
    
     30
  • L
    2018-10-12
    解答楼上的问题,数据规模较大的情况用循环,也就是老师讲的非递归代码

    作者回复: 是的 👍

    
     24
  • Geek_8a2f3f
    2018-10-12
    王老师,你好!说那个限制递归深度的做法只适合规模比较小的情况,那如果规模大了,怎么限制呢?

    作者回复: 自己模拟一个栈 用非递归代码实现

     2
     23
  • 墨墨
    2018-10-12
    老师好,你的github地址可以发下吗?我在前面的章节没看到

    作者回复: github上艘wangzheng0822

     1
     21
  • 塘泥
    2018-10-26
    尾递归的问题,想听听老师的讲解
    
     15
  • Monday
    2018-10-12
    原以为老师会先讲完10个基本的数据结构再讲十种基本的算法。没想到老师会穿插着讲。冒昧的问下老师设计课程的思路。谢谢

    作者回复: 因为后面的内容会用到递归 而递归不依赖后面的内容 拓扑排序了解一下😄

    
     15
  • 风起
    2018-10-12
    调试递归就像写递归一样,
    不要被每一步的细节所困,
    重点在于确认递推关系与结束条件是否正确,
    用条件断点着重调试最初两步与最终两步即可。
    
     13
  • 落叶飞逝的恋
    2018-11-16
    关于走楼梯的思路解析:
    1 走到第1级,有1种方法 ,直接走1

    2 走到第2级,有2种方法 (1,1)(2)总共两种走法

    3 走到第3级,有3种方法 (1,1,1)(1,2)(2,1)总共3种走法

    4 走到第4级,有5种方法 (1,1,1,1)(1,1,2)(1,2,1)(2,1,1)(2,2) 总共5种

    5 走到第5级,有8种方法 依次类推

    以此类推,后面的总等于前面两级方法之和,现在使用递归和递推两种方法解决本问题
    展开
     4
     12
  • feifei
    2018-10-24
    我常用的办法是,打印一个树型结构的日志,每进入一层,深度加一然后打印深度,比如“--”,再接上值,换行,这样可以很清楚的看到信息
     1
     12
  • aof
    2018-10-12
    检测环的答案其实老师已经在文章中的一个例子中讲过了,就是用一个数据结构把查询过的元素放到这个数据结构里面,新来的就先查这个数据结构里面有没有,有就返回,没有就放入到这个数据结构里面。
    
     11
我们在线,来聊聊吧