要理解递归,首先要理解递归。

从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山......


上面这些梗在递归学习博客中广为流传,你读懂了,递归也就明白了。当然上面举例的笑话,很显然少了递归结束的条件,将会导致无休止的递归。

首先说明一下设计递归函数的两个要点:

1.注意“边界”的设定,即什么时候跳出递归函数

2.递归函数主体的设定(即通过哪些语句实现递归)

注:所有,记住是所有!凡是能用递归解决的问题,都可以通过归类抽象出一定的规律,这个规律适用于不同规模的问题。针对递归问题,也一定能通过数学归纳法得到与问题规模相关的函数关系。(一定注意理解!!!!)

背过上面的要点,然后我们开始今天的递归之旅~!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

先举几个简单的例子来理解递归:

  • 阶乘问题

例:计算N!

int 

递归是什么?最直白的解释叫做自己调用自己。观察上面的代码,我们假设计算4的阶乘,可以发现在计算4的阶乘时,又调用计算了3的阶乘,计算3的阶乘时,又调用了2的阶乘,一直到计算1的阶乘(即Factor(1)),然会返回1,返回2的阶乘,返回3的阶乘,最后return出4的阶乘。

当N=4时,每一次函数调用如下图所示,学过栈的同学是不是发现整个运算过程有点像栈,先调用的4*3!,却到最后返回结果(即出栈),最后调用的函数Factor(1)(最后入栈),最先计算完成计算(出栈)。没有问题,你的猜想没有错!递归函数本身底层的实现就是开辟了一个递归栈,不过这里不深入探讨。

引用知乎用户 @褚跃跃 制作的递归流程图

  • 汉诺塔问题

汉诺塔问题(Hanoi)是几乎所有计算机相关书籍在讲到递归时,必讲的一个经典例子。可以说完全弄懂了Hanoi问题,其他的递归问题对你来说也不会有多难。

例:有一座塔,塔里面呢有三个座A,B,C,座A上放着64个大小不等的盘,其中大盘在下,小盘在上。现在有一个人,希望把盘从A移到B上,但一次只能搬一个盘,而且搬的盘只能放在其他两个盘上,且大盘不能压在小盘上。用程序模拟该过程。

新汉诺塔小游戏,在线玩,4399小游戏​www.4399.com

这里贴一个汉诺塔的在线游戏,先耍耍然后我们开始讨论这个经典问题。

假设我们只有3个盘子要进行搬运,那我们是不是有一个唯一的步骤不可缺少,就是在2个小盘在C上的时候,我们把大盘从A->B,然后再把两个小盘通过A移到大盘之上。你仔细想想,上述的陈述,无论你采取什么样方法去搬运,都要经历上面的操作。

那假设我们有4个盘呢,我们是不是也有一个唯一的步骤要经过,就是在3个小盘子在C上的时候,我们把大盘从A->B,然后再把3个小盘通过A从C->B。

那我们有5个盘子呢....

6个....

.......

64个........(推理过程过程是不是像极了数学归纳法)

于是乎我们发现了一个惊天的大秘密,我们的搬运过程是不是可以划分为三个阶段

1.把除了底盘以外的盘子通过B,实现移动A-C

2.将底盘移动到B

3.将C上的盘子通过A移动到B

假设“将N-1个盘子从A针移动到B针”所需次数为An-1,总移动次数为An,那么可以得出的关系就是:An=An-1x 2 + 1。我们也就可以规矩递推公式得出它的移动次数的通项即An = 2^n - 1。

那我们的c/c++代码不久应运而生?

void 

如何理解汉诺塔的递归?

可以继续参考其他答主的回答,都很用心,有图形演示哟~

  • 二叉树的递归遍历算法

相信学过数据结构的同学对这个算法一定不陌生

例;使用递归算法遍历二叉树

void 

在一般实际问题中,递归算法使用其实并不多,但是对递归的理解是很有必要,是一种数学与计算机思维的锻炼。

求n的阶乘的算法框图_算法——递归问题相关推荐

  1. 求n的阶乘的算法框图_算法|从阶乘计算看递归算法

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 1 理解递归 "程序设计是实践计算机思维的重要手段& ...

  2. python枚举算法流程图_算法-枚举

    本章我们进入算法的学习,我们会通过比较经典的例题去讲解一些常用的算法思想,常用的算法思想包括:枚举.递归.分治.贪心.试探.动态迭代和模拟等,本节我们来学习一下枚举算法. 1. 枚举思想 枚举算法我们 ...

  3. python快速排序算法循环_算法:快速排序的Python实现

    一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...

  4. 求n的阶乘的算法框图_单片机常用的14个C语言算法

    问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项 ...

  5. 求n的阶乘的算法框图_阶乘也很有趣:从阶乘到伽玛函数到非整数的阶乘

    阶乘运算(Factorial) 任何大于等于1 的自然数n 阶乘: 也即 下表给出了一些自然数的阶乘值: https://en.wikipedia.org/wiki/Factorial 100!是一个 ...

  6. 求n的阶乘的算法框图_递归算法是一种直接或者间接调用自身函数或者方法的算法...

    http://blog.csdn.NET/wangjinyu501/article/details/8248492 原版 一.基本概念 递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递 ...

  7. 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...

    前言 递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它.在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法.它太基础太重要了,这也是为什么面试的时候,面试官 ...

  8. 求n的阶乘的算法框图_干货丨Python 递归算法指归-百知教育

    1. 递归概述 递归( recursion)是一种编程技巧,某些情况下,甚至是无可替代的技巧.递归可以大幅简化代码,看起来非常简洁,但递归设计却非常抽象,不容易掌握.通常,我们都是自上而下的思考问题, ...

  9. 连通域最小外接矩形算法原理_算法|图论 2W字知识点整理(超全面)

    作者:SovietPower✨ 链接:https://ac.nowcoder.com/discuss/186584 来源:牛客网 度数序列 对于无向图, 为每个点的度数.有 (每条边被计算两次).有偶 ...

最新文章

  1. ssm 异常捕获 统一处理_SpringMVC 统一异常处理介绍及实战
  2. SBB:南土所梁玉婷、孙波等跨气候带土壤移置揭示了气候变暖及施肥对土壤固氮微生物递增的环境过滤作用...
  3. asp下载防盗链代码
  4. XCTF WEB backup
  5. DEBUG主要命令(转)
  6. C. Diverse Permutation(Codeforces Round #275(div2)
  7. Java高级语法笔记-HashMap
  8. ${pageContext.request.contextPath}和request.context
  9. 如何修改MyEclipse的默认工作路径Workplace
  10. libcrypto yum 安装_centos7下nginx 报错需要安装 libcrypto.so.10(OPENSSL_1.0.2)(64bit)
  11. 锐捷服务器虚拟化技术_锐捷核心交换机VSU虚拟化配置
  12. 企业微信网页应用开发 - 消息/事件回调接口
  13. 程序员需知的9个编程学习官网,建议收藏
  14. GTC 2020:开发者谈NS版《巫师3》移植
  15. 二维小球完全弹性碰撞绝对坐标速度计算公式
  16. Linux kernel Namespace源码分析
  17. 怎么减少计算机内存占有,还在为电脑内存占用太高而烦恼吗?教你一招轻松解决...
  18. BiLSTM+CRF实现AI诗人与长短记忆网络
  19. Xbox One手柄
  20. 网络安全实验--网络嗅探器

热门文章

  1. token是什么?token的作用以及运用场景?
  2. Java虚拟机学习资料整理
  3. node.js里的天龙八部
  4. 神奇旋转,告诉我她是顺时针还是逆时针旋转
  5. 用Mpvue开发微信小程序,微信语音聊天
  6. 聊聊 effects 与 reducers--React AntDesign Dva
  7. 打造新一代计算平台,STEPVR将在2022开启元宇宙“大门”
  8. python输入一个五位数、判断是否为回文数_python如何判断是不是回文数
  9. Android 曝光采集(商品view曝光量的统计)
  10. CF1444C Team-Building 可撤销种类并查集