递归
    不知道有新手听没听过别人拿剥糖块来形容递归,诸如一层层地剥好比一层层地进入递归。这种比喻可是误导了我,只想着剥了,其实剥完皮儿,取出糖块,再把皮儿一层层地穿上才算个完整的递归。

递归就是自己调用自己的函数或方法了,一般情况,像我这样的新手刚接触递归的时候,迷就迷在了不明白递归的原理上,在 (c#)数据结构与算法分析 --栈与队列 中说过,编译器一般用栈来实现递归,具体就看那篇文章吧。

这里先举一个用到递归的例子。

求第n项的三角数字,三角数字就是数列中,第n项的值是第n-1项加上n得来的。这里可不是那个斐波那契数列。
    1,3,6,10,15,21......... 这些个数就是三角数字。

这个递归方法就是计算第n项的三角数字:

 1 //使用递归求第n项的三角数
 2 private int triangle(int n)
 3         {
 4             if (n == 1) //这是递归的基准情形,一个递归没有基准的话,就没法跳出递归。
 5             {
 6                 return n;
 7             }
 8             else
 9             {
10                 return (n + triangle(n - 1)); //调用本方法
11             }
12         }

很简单的一个算法,可用 第n个三角数字=(n*n+n)/2 这个公式来验证其正确性。

仔细看看这个图就会完全明白递归到底怎么递归了。

n=5时,开始调用

第1层

n=5

第2层

n=4

第3层

n=3

第4层

n=2

第3层

n=1

返回 1

加 2
返回 3

加 3
返回 6

加 4
返回 10

加 5
返回 15


返回15
(这个表格在firefox下显示有点问题)

这时,应该把递归理顺了吧,自己可以试试用递归求阶乘,然后试着解决汉诺塔问题,google搜一下会有很多汉诺塔问题的源码。

很明显,上面那个递归是尾递归,在某些情况下,比如函数体比较庞大,有很多局部变量,则很容易引起栈溢出。有时候应该消除递归。
   
    这就用到栈了,下面这个源码,功能和上面一样,只不过用栈来消除递归了。

 1 //消除递归,使用栈代替递归
 2         private int triangleStack(int n)
 3         {
 4             Stack<int> traingle = new Stack<int>(); //这个栈来模拟递归中的环境变量
 5 
 6             while (n >= 1) //相当于递归中的基准了
 7             {
 8                 traingle.Push(n); //将每次递减的值压入栈,相当于逐层调用递归
 9                 n = n - 1;
10             }
11 
12             while (traingle.Count > 0) //这个相当于逐层跳出递归
13             {
14                 n = n + traingle.Pop(); //计算
15             }
16 
17             return n;
18         }

不是很难吧,主要把递归的原理理清,思路自然就明了了。

要注意的是,使用递归千万可别忘了基准情形,不然就永远递归不出来了。递归的效率有时候比较低,这样就可以用栈或循环来代替递归了。

转载于:https://www.cnblogs.com/PocketZ/archive/2010/04/14/1711989.html

(转)(c#)数据结构与算法分析 --递归相关推荐

  1. (c#)数据结构与算法分析 --递归

    递归     不知道有新手听没听过别人拿剥糖块来形容递归,诸如一层层地剥好比一层层地进入递归.这种比喻可是误导了我,只想着剥了,其实剥完皮儿,取出糖块,再把皮儿一层层地穿上才算个完整的递归. 递归就是 ...

  2. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  3. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...

    数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...

  4. 数据结构与算法分析-第2章

    <?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...

  5. 二叉堆(最小堆)(数据结构与算法分析的代码实现)

    "堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树" "因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链&qu ...

  6. 数据结构与算法分析 - 5 - 二叉树

    1.树 描述:自由树是一个连通的,无回路的无向图. 树不是一种线性结构,但它具有一定的线性特征. 树也可以这样定义:树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集 ...

  7. 数据结构与算法分析 ——回溯算法之收费公路重建问题

    数据结构与算法分析第十章回溯算法之收费公路重建问题 一.  问题描述: 设给定N个点p1, p2,-,pn,它们位于x-轴上.xi是pi点的x坐标.这N个点确定了N(N-1)/2个点间距离.显然,如果 ...

  8. python数据结构与算法40题_Python数据结构与算法分析(笔记与部分作业)

    最近为了给写搬砖脚本增加一些算法知识,脑残的看起来算法书.Python数据结构与算法分析,本人英语比较差,看的是翻译版本的. 网上有免费的原版的:https://runestone.academy/r ...

  9. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  10. Weiss的数据结构与算法分析(C++版)源码编译说明

    最近尝试编译Weiss的那本数据结构与算法分析(C++版)提供的源代码时,遇到一些问题,特记录如下: 考虑到该书提供的代码是使用模板技术较多,这在提供简洁代码的同时,也给源码的编译带来了一些问题.因而 ...

最新文章

  1. CENTOS6.4 IBUS输入法不显示候选词解决办法
  2. 天津大学计算机学院院长及副院长,李晓红 教授
  3. Python数据结构——序列总结
  4. php ruby 优缺点,php,python,ruby,perl的优缺点?
  5. 【转】navicat远程连接mysql,2003 can't connect to mysql server on 10038
  6. 车辆出厂信息接口_最新10项中标招标信息汇总2020.12.7
  7. word-vba应用
  8. 脑智前沿科普:脑深部电刺激治疗帕金森病的原理
  9. slam入门——十四讲笔记(四)
  10. 基于自抗扰控制adrc的高速列车运行控制算法研究
  11. 华硕2020年显卡_显卡涨价?2020年12月不溢价电脑装机配置推荐——华硕3070 DUAL雪豹篇...
  12. 《大话设计模式 下》
  13. Linux内核学习笔记——Linux中的用户组和权限管理(UID是什么?)
  14. noip2016 day1 t2 天天爱跑步
  15. 开源办公开发平台丨Mysql5.7两套四节点主从结构环境搭建教程(一)
  16. matlab怎么求标准化特征向量,matlab特征向量标准化
  17. win10计算机停止工作,360重装Win10系统后如何应对已停止工作提示的办法
  18. C语言一维数组的定义与常见用法
  19. [经验分享] 覃超直播课-入职新公司后,如何快速斩头露角
  20. python-opencv 眼球跟踪(已开源)

热门文章

  1. 团队管理心得--建团队,管事理人
  2. svn checkout的时候报E000022错误
  3. adodb.connection id password windows用户_Windows 12发布了?一款号称可以取代win10的山寨Windows系统...
  4. java反射代码,java反射
  5. oracle11g服务配置,oracle11g dg broker配置服务的高可用
  6. [渝粤教育] 山东大学 日本历史与文化 参考 资料
  7. [渝粤教育] 平顶山学院 区域分析与规划 参考 资料
  8. 【渝粤教育】电大中专跨境电子商务理论与实务 (8)作业 题库
  9. 计算机视觉实战(八)直方图与傅里叶变换
  10. 计算机视觉实战(七)图像金字塔与轮廓检测