递归算法
来源:互联网 发布:java汉化版 编辑:程序博客网 时间:2024/05/01 21:02
递归算法
定义
总结:
1、循环调用自己
2、函数结束临界条件
经典例子
例一:乘法阶乘
求n!
递归算法实现如下:
int JieChengRecursive(int n) { int sum = 1; if (n >= 2) { sum = n * JieChengRecursive(n - 1); } else { return 1; } return sum; }
例二:汉诺塔
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
最早发明这个问题的人是法国数学家爱德华·卢卡斯。
传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。
若传说属实,僧侣们需要264 ? 1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要5849亿年才能完成。整个宇宙现在也不过137亿年。
这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。
佛教中确实有“浮屠”(塔)这种建筑;有些浮屠亦遵守上述规则而建。“河内塔”一名可能是由中南半岛在殖民时期传入欧洲的。
/// <summary> /// 汉诺塔算法 /// </summary> /// <param name="n">盘数</param> /// <param name="from">源盘位置</param> /// <param name="buffer">中间位置</param> /// <param name="to">目为位置</param> static void hannoi(int n, char from, char buffer, char to) { if (n==1) { Console.WriteLine("Move Disk:{0},from,{1},to,{2}",n,from,to); } else { hannoi(n - 1, from, to, buffer); Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to); hannoi(n - 1, buffer, from, to); } }
例三:斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
特别指出:第0项是0,第1项是第一个1。这个数列从第二项开始,每一项都等于前两项之和。
斐波那契数列递归法实现:
int Fib(int n) { if (n < 1) { return -1; } if (n == 1 || n == 2) { return 1; } return Fib(n - 1) + Fib(n - 2); }
例四:二叉树遍历
例五:字符串全排列
例六:八皇后问题
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- Linux下安装opencv并移植至ARM
- Windows 添加计划任务 每隔一定时间执行指定批处理脚本
- DOS批处理添加任务计划
- lnmp学习之mysql5.5.32安装优化
- 记一次ssh免密码配置
- 递归算法
- lnmp学习之php安装、nginx和php整合
- 网页定位导航特效--jQuery学习
- 都说html css 简单 为啥我觉得那么难
- 大学感悟【三】
- Ubuntu 使用笔记
- MyEclipes使用maven
- iOS 自定义不等高的cell
- Java中hashCode的作用