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) { ...
随机推荐
- Nova 启动虚拟机流程解析
目录 文章目录 目录 前言 从请求说起 nova-api service 阶段 前言 Nova 启动虚拟机的东西太多,持续更新- 从请求说起 无论是通过 Dashboard 还是 CLI 启动一个虚拟 ...
- oracle 创建多个数据库
1. 2. 3. 4. 5. 6. 7.监听程序 8.后面的我全选择默认(脚本位自定义了一下) 9.
- 【HANA系列】SAP HANA 2.0 SPS00 SDA(Smart Data Access)连接Hadoop
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 2.0 SPS ...
- Python学习之表的数据类型
数据类型 数值类型 类型 大小 范围(有符号) 范围(无符号)unsigned约束 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 ...
- python学习之内置函数(二)
4.7.3 内置函数(2) int() str() bool() set() list():将一个可迭代对象转化为列表 tuple():将一个可迭代对象转换成元组 dic(): 通过相应的方式创建字典 ...
- win10更新导致chrome打开网页速度太慢
升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie和edge是可以正常访问的 用这个方法可以 我弄了几天终于 搞好了 我直接转载过来了 近期,工程师收到大量反馈360浏 ...
- body标签中的相关标签
一.内容概要 字体标签 h1~h6 <font> <u> <b> <strong> <em> <sup> <sub> ...
- heartbeat双主高可用
一.基础配置 1.hostnamectl set-hostname node1 (node2) 2.[root@node1 ~]# cat /etc/hosts 192.168.40.128 ...
- python每日一练:0002题
第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中. 示例代码: import os import string import random i ...
- 解决ajax跨越问题
解决方案: ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 如果跨域使用POST方式 ...