知识卡片
递归:把重复当作自身的子任务
内容
循环用”执行完一组指令、再重复执行同一组指令”的方式实现重复,递归则用”把重复的下一轮当作当前这组指令自身的一个子任务来调用”实现重复——就像浏览网页时打开一个新标签页看相关商品,看完关闭标签页再回到原来的页面继续。二分搜索是典型例子:每次都调用同一个搜索函数去处理缩小了一半的子列表,函数执行时看起来像是同时存在多个”激活”(每个激活对应一次调用),但任意时刻只有最内层的激活在真正推进,其余都在等待更内层的激活返回结果。递归同样依赖初始化、修改、终止测试这三要素才能保证不无限展开——终止测试对应的是判断是否满足基本条件(如列表已经缩小到空),”修改”体现在每次调用传给下一层的任务都比当前任务更接近基本条件。发散:递归的”多个激活同时存在但只有一个在真正运行”这个模型,正是理解调用栈的关键——每次递归调用都会在栈上压入一个新的激活记录,栈的深度就是当前挂起的激活个数,这也是为什么递归深度过大会导致栈溢出。
参考来源
《计算机科学概论》第5章《算法》