所谓递归——函数的递归调用。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亿年!

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

  

【C/C++】递归算法的更多相关文章

  1. 递归算法经典实例小结(C#实现)

     一 .递归算法简介 在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法. 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往 ...

  2. 转: JAVA递归算法实例小结

    一.递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候 ...

  3. xml 读取递归算法

    xml 读取递归算法:

  4. 后台返回字符串类型function的处理 (递归算法)

    $(function(){ $.ajax({ type: "post", url: "${ctx}/modules/fos/reference/echart", ...

  5. JAVA递归算法

    1.什么是递归算法 递归算法就是直接或间接调用自己的算法 2.问题1:一列数的规则如下: 1.1.2.3.5.8.13.21.34 ,求第30位数是多少?使用递归实现 public class Fib ...

  6. 【Tree 1】树形结构数据呈现的递归算法实现

    一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...

  7. N个数全排列的非递归算法

    //N个数全排列的非递归算法 #include"stdio.h" void swap(int &a, int &b) { int temp; temp = a; a ...

  8. 递归算法(一)——akm

    要求 已知akm函数如下: { n+1 while m=0 }                          => Rule I akm(m,n)= { akm(m-1,1) while n ...

  9. C# 递归算法与冒泡

    C# 递归算法求 1,1,2,3,5,8,13···static void Main(string[] args){ int[] cSum = new int[10];for (int i = 0; ...

  10. 递归算法实现10进制到N进制的转换

    #include<iostream> using namespace std; int BaseTrans(int data,int B){ int s; ) ; //结束递归算法 s=d ...

随机推荐

  1. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  2. JavaScript技巧总结和本地存储(二)

    离线检测 检测是否离线,html5为此定义了一个navigator.onLine属性,这个属性为true表示设备能上网,false表示离线,这个属性还有点兼容问题.因此单独使用这个属性不能确定网络是否 ...

  3. ML.NET 示例:推荐之矩阵分解

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  4. UART、SPI和I2C详解

    做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释. UART UART是一种通用串行数据总线,用于异步通信.该总线双向通信,可以 ...

  5. 通过 Systemd Journal 收集日志

    随着 systemd 成了主流的 init 系统,systemd 的功能也在不断的增加,比如对系统日志的管理.Systemd 设计的日志系统好处多多,这里笔者就不再赘述了,本文笔者主要介绍 syste ...

  6. Django Rest framework基础使用之 serializer

    rest-framework文档地址:http://www.django-rest-framework.org/ Django Rest framework是一个非常强大且灵活的工具包,用于构建web ...

  7. Acceleration for ML 论文导读

    Energy efficient parallel neuromorphic architectures with approximate arithmetic on FPGA Motivation ...

  8. javascript与php与python的函数写法区别与联系

    1.javascript函数写法种类: (一).第一种 function test(param){ return 111; } (二).第二种 var test = function(param){ ...

  9. http1.0 1.1 与2.0

    长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一 ...

  10. java回调机制——基本理解

    回调(diao):往回调用,反向调用. 英文 call back.call:调用,back:返回,往返. 回调的意思就是杀个回马枪...... 回调(callback),既然是往回调用,那自然有一个正 ...