数据结构和算法——线性结构(3)递归和斐波那契数列、汉诺塔问题
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)递归和斐波那契数列、汉诺塔问题相关推荐
- 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...
- labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...
- 两个经典递归问题:菲波那契数列 + 汉诺塔
一.递归问题的处理步骤 1)抽象出递归公式:对实际问题进行部分穷举,抽象出递归关系(关键),并列出"递归表达式" 2)确定递归出口:找出递归调用终止点 二.菲波那契数列 实际问题: ...
- 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
学习地址:[数据结构与算法基础-java版]
- 【2023王道数据结构】【绪论】思维拓展-通过C++递归与非递归实现斐波那契数列C、C++完整实现(可直接运行)
~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++递归与非递归实现斐波那契数 ...
- 算法—递归生成斐波那契数列
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.递归生成斐波那契数列 二.使用步骤 1.伪代码 2.c 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如 ...
- python中使用递归实现斐波那契数列
python中使用递归实现斐波那契数列 python中使用递归实现斐波那契数列 先来了解一下 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家莱昂纳多·斐波那契(Leo ...
- 【编程实践】Linux Shell 编程:使用 循环和递归 实现斐波那契数列代码
用 Linux Shell 编程语言递归实现斐波那契数列代码:循环和递归 Linux Shell 编程语言是一种强大的工具,它可以轻松地实现程序设计语言中的常见算法. 斐波那契数列 斐波那契数列是一种 ...
- 递归实现斐波那契数列
关于递归求斐波那契数列 首先明白斐波那契数列的特点 即从第三个数开始,数列中的每一项等于其前两项之和,且其前两项都为1 了解其特征后,选择合适的算法解决 这里采用的是经典的递归算法 什么是递归算法? ...
- C语言以递归求斐波那契数列(附完整源码)
递归求斐波那契数列 递归求斐波那契数列完整源码(定义,实现,main函数测试) 递归求斐波那契数列完整源码(定义,实现,main函数测试) #include <locale.h> #inc ...
最新文章
- 高校一副教授2021年全部收入清单来了!对比清华大学教授工资单 ,差距究竟大不大?...
- 信息化监理公司的所有问题归到底是人的使用和管理
- BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
- 一般纳米材料是指尺度为_纳米材料及纳米材料在高分子领域的应用
- 遍历删除List中的元素,会报错? 用iterator.remove() 完美解决
- 【证明】【一题多解】【等价转换】—— 排列组合的计算
- nodejs使用supervisor插件调试效率
- 第五届全国大学生GIS应用技能大赛开发题答案(非官方)
- android 解谜 游戏,Android解谜游戏《100个任务》图文攻略
- 高可用、全集成、定制化,蚂蚁金服自动化测试如何演进
- 统计软件 | Jamovi简介
- xss.haozi.me练习通关
- Codeforces 235C Cyclical Quest(后缀自动机)
- Ipad平板作为MAC苹果电脑的扩展屏幕的技术研究
- 经纬度换算数值_Excel中经纬度数据转换公式
- 开个新栏目,起个恬淡的名字
- 用python画美国国旗
- python写入excel公式有哪些库_python工具库介绍-xlwt 创建xls文件(excel)
- 点云数据处理合集(三)软件、开源库、数据库
- fanuc机器人试题_FANUC机器人报警综合汇总