递归算法O(∩_∩)O哈哈~
***什么是递归? ***
从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说…(以此循环)
应该很多人都听过这个吧!其实这也算是递归的思想吧。不断调用“从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说”只不过没有结束条件,但递归有结束条件吧了。通过上面这个故事,相信也对递归有了一点点的了解吧。接下来我们就来说说对递归的定义吧。
递归的定义
递归算法是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。
在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
懂了吗?这是书上对其的一种定义,我的理解就是函数本身不断的调用自己,直到达到结束的条件(该理解的仅是个人的理解,如有啥不对可以指出哦)。
构成递归需具备的条件
- 子问题须与原始问题为同样的事,且更为简单;
简单来说就是像数学里的公式,改变的仅仅是数值吧。
(该理解的仅是个人的理解,如有啥不对可以指出哦)。 - 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
简单来说就是你每天做着循环的事,总不可能一直做下去吧,总要停下来休息休息出去走走吧。递归也是一样的,不可能一直循环,总要停下来,不然就死循环了!
(该理解的仅是个人的理解,如有啥不对可以指出哦)。
递归的执行,如上图所示,进来之后判断是否为结束条件,如果是则进入出口,如果不是则进入循环体,然后再次调用本身,就这样循环着,直到结束条件为真,跳出函数。
简单例题:
题目要求:编写程序在控制台输出斐波那契数列第20项
输入20,输出6765
斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
这个数列从第三项开始,每一项都等于前两项之和。
即:f[n]=f[n-1]+f[n-2];(n>2)
代码如下:
public class FiB {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(fib(20));}/*** * @param n 是斐波拉契数列个数。* @return 斐波拉契数列个数为n的值*/public static int fib(int n){//n为正整数if(n<=0){System.out.println("输入错误,个数大于0");}if(n==1||n==2){//递归结束条件return 1;}return fib(n-1)+fib(n-2);//fn=fn-1+fn-2; }}
fn=fn-1+fn-2;调用过程:
结果:
例题:
java递归实现N个数全排列输出
有1~n的n个整数,现要求打印出这n个数的所有可能的排列。比如 1 、2、3的全排列:
1, 2, 31, 3, 22, 1, 32, 3, 13, 1, 2 3, 2, 1
思路:
1.找到所有可能出现在第一个位置的字符,即start与其后面所有与它不同的字符互换位置
2.一个位置的字符完成步骤1之后,递归进行下一个位置的互换操作,也就是start+13.直到start是最后一个字符即互换完毕,所以打印第一轮的互换结果,然后返回到上一个位置的for循环中
4.再次进行swap操作将位置复原,以实现for循环将下一个小标的元素与当前元素互换
代码如下:
public class text3 {public static void main(String[] args) {// TODO Auto-generated method stubint[] array={1,2};perm(array,0);}public static void perm(int[]array,int start) {//开始交换位置if(start==array.length) { //出口条件for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}System.out.print('\n');}else {for(int i=start;i<array.length;i++) {swap(array,start,i); //交换数组array中索引为start与i的两个元素perm(array,start+1); swap(array,start,i);//还原}}} public static void swap(int[] array,int s,int i) {//交换函数int t=array[s];array[s]=array[i];array[i]=t;}
}
数组[1, 2]分析,在else的部分
调用了swap(array, 0,0)然后调用perm(array, 1)
调用swap(array, 1, 1)然后调用perm(array, 2),然后在if里面2 == 2成立,打印[1, 2]
调用swap(array, 1,1)把之前交换的swap(array,1,1)复原,虽然看起来没有变化
回到上一层
调用swap(array, 0, 1) 然后调用perm(array, 1)
调用swap(array, 1, 1)然后调用perm(array, 2),然后在if里面2 == 2成立,打印[2, 1]
调用swap(array, 1,1)把之前交换的swap(array,1,1)复原,虽然看起来没有变化
回到上一层
跳出循环,程序结束。
这就是对[1, 2]的全排列。
结果如下:
递归算法O(∩_∩)O哈哈~相关推荐
- 递归算法 流程图_什么是算法?如何学习算法?算法入门
转自:http://www.cnblogs.com/jiangwz/p/7765694.html 算法 什么是算法? 有一个很著名的公式 "程序=数据结构+算法". 曾经跟朋友吃饭 ...
- 递归算法 流程图_什么是算法?如何学习算法?算法入门的学习路径
什么是算法? 有一个很著名的公式 "程序=数据结构+算法". 曾经跟朋友吃饭的时候我问他什么是算法,他说算法嘛,就是一套方法,需要的时候拿过来,套用就可以,我吐槽他,他说的是小学数 ...
- 汉诺塔递归算法进阶_进阶python 1递归
汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...
- python汉诺塔递归算法流程图_详解汉诺塔Python递归程序
学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...
- 大数据相关从业_如何在组织中以数据从业者的身份闪耀
大数据相关从业 Build bridges, keep the maths under your hat and focus on serving. 架起桥梁,将数学放在脑海中,并专注于服务. 通过协 ...
- 季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析
季节性时间序列数据分析 为什么要进行探索性数据分析? (Why Exploratory Data Analysis?) You might have heard that before proceed ...
- 什么事数据科学_如果您想进入数据科学,则必须知道的7件事
什么事数据科学 No way. No freaking way to enter data science any time soon-That is exactly what I thought a ...
- 如何更好的掌握一个知识点_如何成为一个更好的讲故事的人3个关键点
如何更好的掌握一个知识点 You're launching a digital transformation initiative in the middle of the ongoing pande ...
- 大数据ab 测试_在真实数据上进行AB测试应用程序
大数据ab 测试 Hello Everyone! 大家好! I am back with another article about Data Science. In this article, I ...
最新文章
- windows10上使用一个tomcat部署2个项目
- 【错误记录】Android NDK 错误排查记录 ( Could not get version from cmake.dir path ‘xxx\cmake\3.6.4111459‘. )
- Python程序练习题5.1-输出更大的田字格。
- Science:把这个人类特有基因转入猴子后,它们的大脑更大更强了,但科学家没敢让它出生...
- python实现第一个web_使用Python的Flask框架来搭建第一个Web应用程序
- mysql表级锁和行级锁_MySQL表级锁和行级锁
- 霍夫直线检测python_python+opencv实现霍夫变换检测直线的方法
- Fuse Audio Labs VCS-1 Mac - 零延迟通道条插件
- 深度学习(三十二)半监督阶梯网络学习笔记-NIPS 2015
- idea连接sqlite
- esxi 命令行查看设备
- 体验Windows server 2012上安装SQL 2012
- shell逻辑运算符优先级_linux shell 逻辑运算符、逻辑表达式详解
- linux 下的下载管理工具
- python源码剖析_Python源码剖析 深度探索动态语言核心技术
- 问个globle的问题,如何定时更新论坛的数据啊?
- 002--YAML工具
- 什么专业可以留学计算机动画,美国留学计算机动画专业怎么样?
- truelicense使用手册
- 甘超波:NLP自我价值感