所谓递归——函数的递归调用。c语言的这种特性给程序设计带来许多方便。尤其是接触数据结构时,会发现递归的出现频率非常之高,也行之有效~下面是笔者在接触递归这个东西时的一些个人总结和体会:

  1.直接或间接地调用函数本身。我们在程序设计时,往往要自己写一些函数来帮助整个解决方案的完成,有时一个函数中又要调用自身来帮助这个功能的实现。是不是被套话弄晕了?Don‘t worry~开个玩笑了。  

  2.一个简单的例子可以帮助理解递归——求阶乘。请看:

  n!=n*(n-1)!(n>=1);

    =1                 (n=0);

这是求阶乘的公式。我们显然可以写一个子函数来求n!(记这个函数是fac),可是注意到,求n!,我就要求(n-1)!。那么问题来了,求(n-1)! 所用到的函数不还是我们写的这个fac函数吗?

So,我们只要再次调用本身就ok了。下面给出子函数:

  int fac(int n)

  {

    int f;

    if(n<o) printf("error!");

    else if(n==0) f=1;

    else f=n*fac(n-1);

    return f;

  }

  看似好像不比循环简洁,可是,当写复杂一点的代码时,递归的优点就显露出来了。

  3.Execu me?不断调用,何其尽也?

  可以看到,上面的程序并不是一个死循环~原因就在于这句if(n==0) f=1;这就是递归的终止条件。

  总结:一个完整的递归应该有两个必要条件:1.终止条件。2.规模渐小。

  规模,又可以看做上面程序的n,他显然是渐小的。

  4.递归的两个分类

  1) 基于数学公式(如阶乘);

  2) 基于语义(难!);请看下面这个狗血的问题:

  5.Hanoi塔问题。

  可以概述为下面的描述:

具体代码如下:

输入3个时是这样的:

需要多久呢?n个盘子需要移动2^64-1次,假设一秒一次,需要多久呢?

——————答案是约600亿年!

哈哈,等你移完了,世界末日就到了~~~~可是计算机却帮我们实现了这一功能~~真心感到计算机的强大~~~~

  

转载于:https://www.cnblogs.com/duye/p/6075712.html

【C/C++】递归算法相关推荐

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. 什么是php递归算法_PHP递归算法(一)

    在前面的文章中,我们为大家介绍了PHP算法系列之<PHP随机取一算法>和<PHP冒泡排序算法>,需要的朋友可以了解学习.本篇文章我们将继续为大家带来常见的PHP算法,即PHP递 ...

  3. 漫画:5分钟弄懂分治算法!它和递归算法的关系!

    分治顾名思义"分而治之",英文的意思翻译为"分割并征服". 分治思想,简而言之就是将原问题分解成与"原问题相同但是规模更小"的子问题,并可以 ...

  4. 算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)

    1. 递归排序题 通过递归算法来获取一个数组中的最大值 2. 算法思路 采用递归的思路来进行解题,那么肯定是需要自己调用自己的,这也就是递归,于是考虑怎么自己调用自己呢?我们可以采用二分法来制造递归的 ...

  5. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

  6. PHP开发之递归算法的三种实现方法

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...

  7. 汉诺塔递归与非递归算法

    问题描述: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这 ...

  8. 2.2基本算法之递归和自调用函数_你为什么学不会递归?读完这篇文章轻松理解递归算法...

    对于很多编程初学者来说,递归算法是学习语言的最大障碍之一.很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢. 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却 ...

  9. 实习二 栈、队列和递归算法设计 (题目:停车场管理 )

    一.需求分析 1.每一组输入数据包括:汽车"到达"或"离去"信息.汽车牌照号码以 及到达或离去的时刻. 2.输出信息:若是车辆到达,则输出汽车在停车场内或便道上 ...

  10. 递归算法转换为非递归算法的技巧

    递归算法转换为非递归算法的技巧 递归函数具有很好的可读性和可维护性,但是大部分情况下程序效率不如非递归函数,所以在程序设计中一般喜欢先用递归解决问题,在保证方法正确的前提下再转换为非递归函数以提高效率 ...

最新文章

  1. 使用python爬取教程生成PDF
  2. iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法
  3. 英语四级计算机准考证查询,四级成绩查询_四级查分:什么?准考证不见了?!!!_沪江英语...
  4. php安装pcntl扩展
  5. 后缀数组DC3算法实现
  6. Javascript高级程序设计第二版第十四章--异常--笔记
  7. VBSCRIPT的循环挺好理解的
  8. Linux查看内存占用--free
  9. mysql比较两个表中count_mysql两个表统计查询问题?
  10. Java Swing Action 动作
  11. python上机实践_python程序设计江红上机实践答案
  12. 计算机二级Java上机环境安装与使用
  13. 安装vs遇到 不受信任的证书或者 时间戳签名和/或证书无法验证或已损坏 解决方案
  14. Kali-简易的Linux系统Dos网站压力测试(攻击)
  15. 360腾讯计算机比赛,巅峰对决 腾讯电脑管家VS360详尽评测
  16. 电路里的希腊字母读音
  17. 计算机中cpu是指什么意思,CPU是什么?CPU又是什么意思?
  18. PS怎么把图片处理的更清晰
  19. 细说共模干扰和差模干扰
  20. 离线浏览工具webdup 可下载网站页面

热门文章

  1. STM32H743+CubeMX-解决FDCAN控制器无法接收远程帧
  2. Vue第二部分(4): 嵌套路由和路由传参
  3. Vue第二部分(3):路由 VueRouter
  4. ThinkPHP6项目基操(15.实战部分 阿里云短信redis)
  5. 信息安全工程师笔记-网络安全测评技术与标准
  6. Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
  7. Spring Boot通过url设置国际化
  8. Qt + Python + OpenCV图标替换工具 之 Qt界面设计(四)
  9. VS加快程序编译速度——以VS2013为例
  10. WEB安全基础-WEB通信