***什么是递归? ***
从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说…(以此循环)
应该很多人都听过这个吧!其实这也算是递归的思想吧。不断调用“从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说”只不过没有结束条件,但递归有结束条件吧了。通过上面这个故事,相信也对递归有了一点点的了解吧。接下来我们就来说说对递归的定义吧。

递归的定义

递归算法是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。

在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

懂了吗?这是书上对其的一种定义,我的理解就是函数本身不断的调用自己,直到达到结束的条件(该理解的仅是个人的理解,如有啥不对可以指出哦)。

构成递归需具备的条件

  1. 子问题须与原始问题为同样的事,且更为简单;
    简单来说就是像数学里的公式,改变的仅仅是数值吧。
    (该理解的仅是个人的理解,如有啥不对可以指出哦)。
  2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
    简单来说就是你每天做着循环的事,总不可能一直做下去吧,总要停下来休息休息出去走走吧。递归也是一样的,不可能一直循环,总要停下来,不然就死循环了!
    (该理解的仅是个人的理解,如有啥不对可以指出哦)。

    递归的执行,如上图所示,进来之后判断是否为结束条件,如果是则进入出口,如果不是则进入循环体,然后再次调用本身,就这样循环着,直到结束条件为真,跳出函数。

简单例题:

题目要求:编写程序在控制台输出斐波那契数列第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+1

3.直到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哈哈~相关推荐

  1. 递归算法 流程图_什么是算法?如何学习算法?算法入门

    转自:http://www.cnblogs.com/jiangwz/p/7765694.html 算法 什么是算法? 有一个很著名的公式 "程序=数据结构+算法". 曾经跟朋友吃饭 ...

  2. 递归算法 流程图_什么是算法?如何学习算法?算法入门的学习路径

    什么是算法? 有一个很著名的公式 "程序=数据结构+算法". 曾经跟朋友吃饭的时候我问他什么是算法,他说算法嘛,就是一套方法,需要的时候拿过来,套用就可以,我吐槽他,他说的是小学数 ...

  3. 汉诺塔递归算法进阶_进阶python 1递归

    汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...

  4. python汉诺塔递归算法流程图_详解汉诺塔Python递归程序

    学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...

  5. 大数据相关从业_如何在组织中以数据从业者的身份闪耀

    大数据相关从业 Build bridges, keep the maths under your hat and focus on serving. 架起桥梁,将数学放在脑海中,并专注于服务. 通过协 ...

  6. 季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析

    季节性时间序列数据分析 为什么要进行探索性数据分析? (Why Exploratory Data Analysis?) You might have heard that before proceed ...

  7. 什么事数据科学_如果您想进入数据科学,则必须知道的7件事

    什么事数据科学 No way. No freaking way to enter data science any time soon-That is exactly what I thought a ...

  8. 如何更好的掌握一个知识点_如何成为一个更好的讲故事的人3个关键点

    如何更好的掌握一个知识点 You're launching a digital transformation initiative in the middle of the ongoing pande ...

  9. 大数据ab 测试_在真实数据上进行AB测试应用程序

    大数据ab 测试 Hello Everyone! 大家好! I am back with another article about Data Science. In this article, I ...

最新文章

  1. windows10上使用一个tomcat部署2个项目
  2. 【错误记录】Android NDK 错误排查记录 ( Could not get version from cmake.dir path ‘xxx\cmake\3.6.4111459‘. )
  3. Python程序练习题5.1-输出更大的田字格。
  4. Science:把这个人类特有基因转入猴子后,它们的大脑更大更强了,但科学家没敢让它出生...
  5. python实现第一个web_使用Python的Flask框架来搭建第一个Web应用程序
  6. mysql表级锁和行级锁_MySQL表级锁和行级锁
  7. 霍夫直线检测python_python+opencv实现霍夫变换检测直线的方法
  8. Fuse Audio Labs VCS-1 Mac - 零延迟通道条插件
  9. 深度学习(三十二)半监督阶梯网络学习笔记-NIPS 2015
  10. idea连接sqlite
  11. esxi 命令行查看设备
  12. 体验Windows server 2012上安装SQL 2012
  13. shell逻辑运算符优先级_linux shell 逻辑运算符、逻辑表达式详解
  14. linux 下的下载管理工具
  15. python源码剖析_Python源码剖析 深度探索动态语言核心技术
  16. 问个globle的问题,如何定时更新论坛的数据啊?
  17. 002--YAML工具
  18. 什么专业可以留学计算机动画,美国留学计算机动画专业怎么样?
  19. truelicense使用手册
  20. 甘超波:NLP自我价值感

热门文章

  1. jsp页面跳转与刷新的总结
  2. cesium给地图添加比例尺学习踩坑记录
  3. hdu4841 圆桌问题
  4. 自建k8s平台-高可用k8s集群
  5. telnet服务器端口
  6. 电子计算机及多媒体教学设计,第六课 多媒体与多媒体技术
  7. 如何使软件标准真正能够落地?且看《深入理解GJB5000A》公开课!
  8. 我的世界服务器反作弊怎么修改,我的世界如何利用命令方块反作弊 反作弊命令攻略...
  9. 天载优配简述两会以维稳主基调
  10. android_porting步骤