1. 递归

  递归总的来说就是在一个方法内部再次调用此方法的编程方式。

下面用一段代码实现:

public class Recursive {public static void main(String[] args) {print(10);}public static void print(int n){if (n > 0){System.out.println(n);print(n - 1);}}
}

  递归实现时要给递归写一个出口,不然递归就会无限循环直到堆栈溢出。就像上面的递归如果不判断输入的n,就会一直递归下去,如图:

正常递归如图:

2. 斐波那契数列

  斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、… 可以看出的规律是:第一项和第二项为1,从第三项开始,每项的数等于前两项之和。

代码实现:

public class Febonacci {public static void main(String[] args) {//斐波那契数列:1 1 2 3 5 8 13System.out.println(febonacci(20));}//打印第n项的数public static int  febonacci(int i){if (i <= 0 ){System.out.println("输入错误");return 0;}if(i == 1 || i == 2){return 1;}else{return febonacci( i - 1 )+febonacci(i - 2);}}
}

执行结果:

3. 汉诺塔问题

emsp; 汉诺塔问题就是从左到右有3根柱子,最左边柱子上有从小到大的n个盘子依次叠在柱子上,现在要将最左边柱子上的盘子移到右边柱子上,原则是一次只能移动一个盘子,小盘子不能叠在大盘子上面。

要解决这个问题也得用到递归的思想,先从一个盘子的时候分析,一个盘子的话直接从A移到C就可以了,两个盘子的时候就要先把上面的盘子移动到B上,再把下面的盘子移动到C上,再把B上的盘子移动到C上就完成了,三个盘子的时候把上面的两个盘子看成一个整体,最下面的大盘子是一个整体,在结合一个盘子和两个盘子的方法,递归思想就解决了这个问题。

代码实现:

public class Hanoi{public static void main(String[] args) {hanoi(1,'A', 'B','C');System.out.println("---------------");hanoi(2,'A', 'B','C');System.out.println("---------------");hanoi(3,'A', 'B','C');}public static void hanoi(int n, char from, char in, char to){/** @author: ZYH* @description: TODO* data:  21:37* @param n 盘子数量* @param from 左边柱子* @param in 中间柱子* @param to 右边柱子* @return void*/if (n == 0){System.out.println("盘子数不能为零");return;}if (n == 1){System.out.println("第1个盘子从"+from+"移动到"+to);}else{//如果盘子数大于1,不管有几个盘子,都把盘子看成两个整体,最下面的大盘子和上面的所有盘子两部分//移动上面的整体到中间柱子hanoi(n - 1, from, to, in);//把下面的大盘子移动到右边柱子System.out.println("第"+n+"个盘子移动到"+to);//再把中间柱子的整体移动到右边大盘子上面hanoi(n-1, in, from, to);}}
}

分别打印一个、两个、三个盘子时的结果:

数据结构和算法——线性结构(3)递归和斐波那契数列、汉诺塔问题相关推荐

  1. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...

  2. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...

  3. 两个经典递归问题:菲波那契数列 + 汉诺塔

    一.递归问题的处理步骤 1)抽象出递归公式:对实际问题进行部分穷举,抽象出递归关系(关键),并列出"递归表达式" 2)确定递归出口:找出递归调用终止点 二.菲波那契数列 实际问题: ...

  4. 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】

    学习地址:[数据结构与算法基础-java版]                  

  5. 【2023王道数据结构】【绪论】思维拓展-通过C++递归与非递归实现斐波那契数列C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++递归与非递归实现斐波那契数 ...

  6. 算法—递归生成斐波那契数列

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.递归生成斐波那契数列 二.使用步骤 1.伪代码 2.c 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如 ...

  7. python中使用递归实现斐波那契数列

    python中使用递归实现斐波那契数列 python中使用递归实现斐波那契数列 先来了解一下 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家莱昂纳多·斐波那契(Leo ...

  8. 【编程实践】Linux Shell 编程:使用 循环和递归 实现斐波那契数列代码

    用 Linux Shell 编程语言递归实现斐波那契数列代码:循环和递归 Linux Shell 编程语言是一种强大的工具,它可以轻松地实现程序设计语言中的常见算法. 斐波那契数列 斐波那契数列是一种 ...

  9. 递归实现斐波那契数列

    关于递归求斐波那契数列 首先明白斐波那契数列的特点 即从第三个数开始,数列中的每一项等于其前两项之和,且其前两项都为1 了解其特征后,选择合适的算法解决 这里采用的是经典的递归算法 什么是递归算法? ...

  10. C语言以递归求斐波那契数列(附完整源码)

    递归求斐波那契数列 递归求斐波那契数列完整源码(定义,实现,main函数测试) 递归求斐波那契数列完整源码(定义,实现,main函数测试) #include <locale.h> #inc ...

最新文章

  1. 高校一副教授2021年全部收入清单来了!对比清华大学教授工资单 ,差距究竟大不大?...
  2. 信息化监理公司的所有问题归到底是人的使用和管理
  3. BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
  4. 一般纳米材料是指尺度为_纳米材料及纳米材料在高分子领域的应用
  5. 遍历删除List中的元素,会报错? 用iterator.remove() 完美解决
  6. 【证明】【一题多解】【等价转换】—— 排列组合的计算
  7. nodejs使用supervisor插件调试效率
  8. 第五届全国大学生GIS应用技能大赛开发题答案(非官方)
  9. android 解谜 游戏,Android解谜游戏《100个任务》图文攻略
  10. 高可用、全集成、定制化,蚂蚁金服自动化测试如何演进
  11. 统计软件 | Jamovi简介
  12. xss.haozi.me练习通关
  13. Codeforces 235C Cyclical Quest(后缀自动机)
  14. Ipad平板作为MAC苹果电脑的扩展屏幕的技术研究
  15. 经纬度换算数值_Excel中经纬度数据转换公式
  16. 开个新栏目,起个恬淡的名字
  17. 用python画美国国旗
  18. python写入excel公式有哪些库_python工具库介绍-xlwt 创建xls文件(excel)
  19. 点云数据处理合集(三)软件、开源库、数据库
  20. fanuc机器人试题_FANUC机器人报警综合汇总

热门文章

  1. BBS论坛(二十三)
  2. java 生成Excel开门篇
  3. selenium实现失败重运行
  4. bzoj1047-理想的正方形(二维单调队列)
  5. 【项目总结】订单性质识别
  6. tomcat 虚拟目录与显示目录中文件列表
  7. Shell 获取进程号
  8. Button,LinkButton,ImageButton,HyperLink使用
  9. 二叉树层次遍历c语言_LeetCode 树 107.二叉树的层次遍历Ⅱ
  10. 【大数据部落】基于随机森林、svm、CNN机器学习的风控欺诈识别模型