一 、递归算法简介

在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。
  递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
  (1) 递归就是在过程或函数里调用自身。
  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。

  借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。但在带来便捷的同时,也会有一些缺点,也即:通常用递归方法的运行效率不高。

 二 、Fibonacci数列和阶乘

1、 Fibonacci数列

提到递归,我们可能会想到的一个实例便是斐波那契数列。斐波那契数列就是如下的数列:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …,总之,就是第N(N > 2)个数等于第(N - 1)个数和(N - 2)个数的和。用递归算法实现如下:

 public static int Fibonacci(int n){if (n < 0) return -1;if (n == 0) return 0;if (n == 1) return 1;return Fibonacci(n - 1) + Fibonacci(n - 2);}

2、阶乘 

还有就是求一个数的阶乘,也会用到递归,这个比较简单,直接给出实现代码,如图:

 三 、汉诺塔问题

汉诺塔是根据一个传说形成的数学问题:

        汉诺塔示意图(图片来自网络)

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
  1、每次只能移动一个圆盘;
  2、大盘不能叠在小盘上面。
  提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
  问:如何移?最少要移动多少次?

下面是汉诺塔的递归求解实现(C#代码):

public static void hannoi(int n, string from, string buffer, string to){if (n == 1){Console.WriteLine("Move disk " + n + " from " + from + " to " + to);}else{hannoi(n - 1, from, to, buffer);Console.WriteLine("Move disk " + n + " from " + from + " to " + to);hannoi(n - 1, buffer, from, to);}}

其运行结果如图(大家可以跟上面的gif图片对比一下):

 四 、排列组合

1、输出任意个数字母、数字的全排列

  对于一个长度为n的串或者n个字符(数字、节点)组成的字符串数组,它的全排列共有A(n, n)=n!种。这个问题也是一个递归的问题。如1,2,3,全排列可得到:{123,132,213,231,312,321}。

用递归算法实现代码如下:

public static void Permutation(string[] nums, int m, int n){string t;if (m < n - 1){Permutation(nums, m + 1, n);for (int i = m + 1; i < n; i++){//可抽取Swap方法t = nums[m];nums[m] = nums[i];nums[i] = t;Permutation(nums, m + 1, n);//可抽取Swap方法t = nums[m];nums[m] = nums[i];nums[i] = t;}}else{for (int j = 0; j < nums.Length; j++){Console.Write(nums[j]);}Console.WriteLine();}}

调用代码如下:

static void Main(string[] args){Nums = new string[] { "a", "b", "c" };Permutation(Nums, 0, Nums.Length);
         Console.ReadKey();}

这里传入一个string数组,abc三个字母来测试,输出如下图:

2、将全排列结果保存到链表中

  有时候,我们需要将全排列的结果保存,然后做其他的处理,我们可以将结果保存到一个链表中。我们定义如下类作为链表的节点,代码如下:

   public class Node{public string value { get; set; }public Node nextNode { get; set; }public Node(string value){this.value = value;this.nextNode = null;}}

此时声明全局变量,如下:

public static List<Node> NodeList = new List<Node>();

这个时候,我们修改Permutation方法,如下:

  public static void Permutation(string[] nums, int m, int n){string t;if (m < n - 1){Permutation(nums, m + 1, n);for (int i = m + 1; i < n; i++){//可抽取Swap方法t = nums[m];nums[m] = nums[i];nums[i] = t;Permutation(nums, m + 1, n);//可抽取Swap方法t = nums[m];nums[m] = nums[i];nums[i] = t;}}else{Node root = null;Node currentNode;for (int j = 0; j < nums.Length; j++){currentNode = new Node(nums[j]);currentNode.nextNode = root;root = currentNode;}NodeList.Add(root);}}

这样,我们执行了Permutation方法后,就将结果保存到链表中了。用的时候,我们只要遍历NodeList就可以了。如图:

递归算法就先说到这里了。谈到算法,就必需提数据结构,看来真的要“学到老了”~~

作者:雲霏霏

QQ交流群:243633526

博客地址:http://www.cnblogs.com/yunfeifei/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

如果大家感觉我的博文对大家有帮助,请推荐支持一把,给我写作的动力。

递归算法经典实例小结(C#实现)相关推荐

  1. java古典兔子问题c语言,Java递归算法经典实例(经典兔子问题)

    Java递归算法经典实例(经典兔子问题) 题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思 ...

  2. 递归Java_Java递归算法经典实例

    原标题:Java递归算法经典实例 简单递归定义 什么叫递归?(先定义一个比较简单的说法,为了理解,不一定对) 递归:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候, ...

  3. java递归算法经典实例_Java实现简单的递归操作方法实例

    前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的 ...

  4. 递归算法经典实例python-Python进阶:递归算法

    一.递归定义 如果函数中包含了对其自身的调用,该函数就是递归的: 递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法: 基本要素 基线条件:确定递归到何时终止,函数 ...

  5. java兔子问题 递归_Java递归算法经典实例(经典兔子问题)

    题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思指的是每个月的兔子总对数:假设将兔子分为小 ...

  6. php递归算法经典实例,php递归算法应用实例

    例子,php递归算法实例. 复制代码 代码示例: function Type($tid) { $rs = $this->conn->Execute("SELECT * FROM ...

  7. python递归算法经典实例-Python递归算法详解

    递归的概念很简单,如果函数包含了对其自身的调用,该函数就是递归的. 递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法. 在使用递归时,需要注意以下几点: 递归就是 ...

  8. c语言递归法1 2 n,递归法_C语言递归法_递归算法经典实例(2)

    在网上搜索梵塔游戏fanta.exe,自己动手,体会梵塔问题,尝试解决问题. 3 问题分析 教师提出问题: 1. 盘子移动过程中的两个要求? 2. 寻找规律:(教师引导,学生描述移动过程) (1)两个 ...

  9. 递归算法经典实例_掌握这10道经典面试算法题(含答案),攻克递归算法【程序员必备】...

    1. 树的高度 2. 平衡树 3. 两节点的最长路径 4. 翻转树 5. 归并两棵树 6. 判断路径和是否等于一个数 7. 统计路径和等于一个数的路径数量 8. 子树 9. 树的对称 10. 最小路径 ...

  10. 递归算法经典实例_【经典算法】利用递归方法求5!

    找出数组只出现一次的数字 题目 利用递归方法求5! 示例: 输入: 5!输出: 120 思路: 当传入5时,5>1,所以返回recursion(4)*5; recursion(4)则调用recu ...

最新文章

  1. mysql 5.7 存储引擎_mysql5.7——innodb存储引擎总结
  2. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  3. ifix从sqlserver里读数据_ifix连接SQL和读写EXCEL的方法
  4. linux操作系统上课,Linux操作系统使用的文件系统是
  5. 告别Kafka Stream,让轻量级流处理更加简单
  6. Hadoop技术之Hadoop HA 机制学习
  7. centos 6.5 配置网络
  8. [跟我学UML] UML中的对象图
  9. Eclipse导入Zookeeper源码Version2017.11.3
  10. eth java,一个轻量级的Java实现的ETH库
  11. 智能摄像机的网络安全如何保障?
  12. Atitit.软件GUI按钮与仪表盘(01)--报警系统--
  13. 301.删除无效的括号
  14. 如何通过OWA登录界面修改域用户的密码
  15. CoDeSys连接触摸屏
  16. 产品经理面试技巧及常见问题
  17. MySQL5.7.32 64位解压缩版 windows操作系统安装教程图解
  18. xp计算机护眼模式,xp系统桌面上老是显示护眼模式!(图)
  19. 拟合函数未知数个数与用于拟合的序列点数的关系
  20. 人最大的教养,是原谅父母的不完美

热门文章

  1. adb 黑域app_黑域app|黑域手机工具下载 V1.3_下载 - 偶要下载手机频道
  2. C语言———求”完数“
  3. java1.8 64_jdk 1.8 64位 官方版
  4. LoRa无线网络技术概述
  5. NMEA0183协议中的GGA语句解析
  6. 第一行代码android第三版pdf,第一行代码:Android PDF 下载
  7. 数学建模各种软件对比(MATLAB/Lingo/SAS/SPSS)
  8. GPS从入门到放弃(十九) --- 精密星历
  9. 邮局用计算机对信件进行自动分拣,计算机组成结构习题集
  10. 前端CSS基础——表单元素单选框的美化