java作业利用递归解决问题
第一题
利用递归求组合数
设计思想
(1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算
(2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数,并且每次判断,行列和用户想要得到数的行列是否相同
(3)递归方法,递归调用函数,通过地递推公式从后往前推导 求C[n,k]=C[n-1,k-1]+C[n-1,k],根据这个公式直到n=1或者k=0;或者n=k相等时结束
程序流程图
程序源代码
import java.util.Scanner;
public class Yanghui {
public int Jiecheng(int i){ //递归阶乘
if(i==1||i==0)
{
return 1;
}
return i*Jiecheng(i-1);
}
public int Ditui(int i,int j)
{
int a[][]=new int[100][100]; //声明二维数组用来储存杨辉三角
a[0][0]=1;
int result=1; //用来保存结果
for(int p=1;p<100;p++)
for(int q=0;q<=p;q++)
{
if(q==0||p==q) //杨辉三角的两腰上的数为1
{
a[p][q]=1;
}
else
a[p][q]=a[p-1][q-1]+a[p-1][q]; //递推求结果
if(p==i&&q==j) //判断是不是要输出的结果
{
result=a[p][q];
break;
}
}
return result;
}
public int Zuhe(int i,int j)//组合数公式的下标
{
if(i==0||j<=1||i==j)
{
return 1;
}
return Zuhe(i-1,j-1)+Zuhe(i-1,j);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Yanghui yh=new Yanghui();
System.out.println("请输入组合数下标和行标(用空格或者回车区分)");
Scanner input=new Scanner(System.in);
int hang=input.nextInt(); //组合数的下标
int lie=input.nextInt(); //组合数上标
int fenzi,fenmu;
fenzi=yh.Jiecheng(hang); //使用阶乘方式计算结果的分子
fenmu=yh.Jiecheng(lie)*yh.Jiecheng(hang-lie); //计算分母
System.out.println("利用阶乘计算结果:"+fenzi/fenmu+" "); //输出结果
System.out.println("利用递推方式计算结果:"+yh.Ditui(hang, lie)+" ");
System.out.println("利用递归方式计算结果:"+yh.Zuhe(hang+1, lie+1)+" ");
}
}
测试结果截图
第二题
汉诺塔问题
设计思想
题目要求将n个盘子借助2号杆从1号到3号,首先想假如是两个盘子,就是把第一个放到2.第二个放到三,再将二号放到三号。假如是三个就将上边两个借助三号放到二号,再将最后一个放到三号,在把二号的借助一号放到三号。依次类推。利用递归实现。就是从n个盘子开始,将n-1个移到二号,在将最后一个移到三,将二号上的借助一号移到三。那么n-1个移到二号也是如此,知道只剩一个盘子,算法结束。
程序流程图
程序源代码
import java.util.Scanner;
public class Hannt {
public void Hnt(int a,char one,char two,char three){ //将one上的借助two移到三
if(a==1)
move(one,three);
else
{
Hnt(a-1,one,three,two); //从one借助three移动到two
move(one,three);
Hnt(a-1,two,one,three);
}
}
public void move(char x,char y){
System.out.println(x+"->"+y); //从x移到y
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Hannt h=new Hannt();
Scanner input=new Scanner(System.in);
System.out.print("请输入初始盘子数量:");
int num=input.nextInt();
h.Hnt(num,'1','2','3');
}
}
测试结果截图
第三题
检查字符串是否为回文数
设计思想
统计字符串长度,然后定义两个数,一个保存初始位置,第二保存末尾位置,通过字符串中提取函数,提取相对位置字符,并匹配是否相同,每次执行后长度都减二,直到长度为零或一,并输出结果。
程序流程图
程序源代码
import java.util.Scanner;
public class Huiwen {
public int Hw(String str,int length,int star,int stop){
if(length==0||length==1)
{
return 1;
}
if(str.charAt(star)!=str.charAt(stop))
{
return 0;
}
else
{
return Hw(str,length-2,star+1,stop-1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
String s=input.nextLine();
Huiwen hw=new Huiwen();
int l=s.length();
if(hw.Hw(s, l, 0, l-1)==1)
{
System.out.println("是回文字符串");
}
else
System.out.println("不是回文字符串");
}
}
测试结果截图
总结
这三个题都是根据递归完成的,在过程中遇到的错误大都是递归无法跳出,结束条件不完整导致直接报错。所以在下次应该仔细检查结束条件,这是最重要的。
java作业利用递归解决问题的更多相关文章
- Java中利用随机数的猜拳游戏
Java中利用随机数的猜拳游戏,实现非常简单,重难点在于随机数的产生. 首先GameJude类是用于判断输赢的一个类: package testGame; public class GameJudge ...
- 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下
再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...
- Java之利用Freemarker模板引擎实现代码生成器,提高效率
https://blog.csdn.net/huangwenyi1010/article/details/71249258 java模板引擎freemarker代码生成器 更多 个人分类: 一步一步 ...
- JAVA算法之递归
Ⅰ.三角数字 首先我们来看一组数字:1,3,6,10,15,21.....,在这个数列中第n项是由n-1项加n得到的,这个序列中的数字称为三角数字因为他们可以形象化地表示成一个三角形排列.如下图 通过 ...
- JAVA课堂题目--递归来判断回数
package class20190923; import java.util.Scanner; public class Classtext { private static int n=0; pr ...
- Java中的递归运算
Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...
- 第五次Java作业
作业一: 文件显示列表框. 增加了下拉式组合框,text区域设置颜色为红色. import javax.swing.*; import java.awt.*; import java.io.File; ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- java 20 -1 递归的概述和案例
/* * 递归:方法定义中调用方法本身的现象 * * 方法的嵌套调用,这不是递归. * Math.max(Math.max(a,b),c); * * public void show(int n) { ...
随机推荐
- 无界面上(linux)生成测试报告(3)
无界面上(linux)生成测试报告 1.待jmx文件运行完成后,键入命令进入到jtl文件下: #cd testresult#bin目录下使用此命令,进入到jtl文件下 #jmeter -g pushG ...
- Linux下搭建Git服务器
1.安装Git 见 Jenkins持续集成环境部署 第四节 2.创建Git用户和用户组 groupadd git useradd git -g git 3.创建证书切换到git用户创建证书 su gi ...
- nginx报错:nginx: [emerg] unknown directive in /etc/nginx/conf.d/test.conf:4
nginx报错:nginx: [emerg] unknown directive in /etc/nginx/conf.d/test.conf:4 解决: 第四行出现了 tab 空格 , 换成正常的 ...
- zabbix没有10051端口解决
1.查看zabbix的日志 [root@bogon ldap]# cat /tmp/zabbix_server.log '/var/lib/mysql/mysql.sock' (2) 2848:201 ...
- CSS3实用指南 初读笔记
1.7.1 浏览器前缀 当一个浏览器实现了一个新的属性.值或者选择器,而这个特性还不是处于候选推荐标准状态的时候,在属性前面会添加一个前缀以便于它的渲染引擎识别. CSS属性的浏览器前缀: 前 ...
- Synchronized知道这些就可以了
Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...
- navicat 系列软件一点击菜单栏就闪退
现象:安装多个版本都出现了闪退的现象 解决方案:后来发现,原来是启动了有道词典屏幕取词才会出现这种现象,关了有道就没事.
- 【PyTorch】PyTorch中的梯度累加
PyTorch中的梯度累加 使用PyTorch实现梯度累加变相扩大batch PyTorch中在反向传播前为什么要手动将梯度清零? - Pascal的回答 - 知乎 https://www.zhihu ...
- Robots协议一定放在网站根目录下
一.网络爬虫的尺寸 1.以爬取网页,玩转网页为目的进行小规模,数据量小对爬取速度不敏感的可以使用request库实现功能(占90%) 2.以爬取网站或爬取系列网站为目的,比如说获取一个或多个旅游网站的 ...
- lua基础学习(四)
一,lua字符串 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. 1.几个常用的转义字符 \b 退格 \f 换页 \n 换行 \r 回车 \t 跳到下一个tab位置 \0 ...