第一题

利用递归求组合数

设计思想

(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作业利用递归解决问题的更多相关文章

  1. Java中利用随机数的猜拳游戏

    Java中利用随机数的猜拳游戏,实现非常简单,重难点在于随机数的产生. 首先GameJude类是用于判断输赢的一个类: package testGame; public class GameJudge ...

  2. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

  3. Java之利用Freemarker模板引擎实现代码生成器,提高效率

    https://blog.csdn.net/huangwenyi1010/article/details/71249258  java模板引擎freemarker代码生成器 更多 个人分类: 一步一步 ...

  4. JAVA算法之递归

    Ⅰ.三角数字 首先我们来看一组数字:1,3,6,10,15,21.....,在这个数列中第n项是由n-1项加n得到的,这个序列中的数字称为三角数字因为他们可以形象化地表示成一个三角形排列.如下图 通过 ...

  5. JAVA课堂题目--递归来判断回数

    package class20190923; import java.util.Scanner; public class Classtext { private static int n=0; pr ...

  6. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  7. 第五次Java作业

    作业一: 文件显示列表框. 增加了下拉式组合框,text区域设置颜色为红色. import javax.swing.*; import java.awt.*; import java.io.File; ...

  8. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  9. java 20 -1 递归的概述和案例

    /* * 递归:方法定义中调用方法本身的现象 * * 方法的嵌套调用,这不是递归. * Math.max(Math.max(a,b),c); * * public void show(int n) { ...

随机推荐

  1. Selenium 2自动化测试实战9(简单元素操作)

    一.简单元素操作 1. webdriver中常用的几个方法: clear():清除文本 send_keys(*value):模拟按键输入 click():单击元素 clear()方法用于清除文本输入框 ...

  2. 子系统 安装vsftpd

    1.安装命令 sudo apt install vsftpd 2.为FTP添加用户,使用sudo useradd -m sunftp命令添加一个sunftp的用户 3. 授权文件夹  chmod 77 ...

  3. JMeter5.0核心源码浅析[转]

    [转自:https://blog.csdn.net/zuozewei/article/details/85042829] 源码下载地址:https://github.com/apache/jmeter ...

  4. 新增存储用Parted分区并建LVM卷

    新增存储用Parted分区并建LVM卷 一,Parted分区 1,parted分区  www.ahlinux.com # parted /dev/sda GNU Parted 2.1 使用 /dev/ ...

  5. k8s、CI/CD、pipline介绍

    参照文档: https://blog.csdn.net/qq_35299863/article/details/84329798 https://github.com/xgh2016/k8s-CICD ...

  6. nginx配置thinkphp项目(nginx下去掉index.php)

    server { listen 80; server_name xxxxx; root "/www/public"; location / { index index.html i ...

  7. redhat java配置

    原来的java版本为1.4 whereis java后 将java原来的目录全部删除 拿来新的1.8的安装好的java包 vi /etc/profile插入 JAVA_HOME=/usr/local/ ...

  8. c语言1作业07

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9932 我在这个课程的目 ...

  9. stack的常见用法

    stack的常见用法 栈是什么? 栈是一种先进后出的容器 栈的定义 引入头文件 # include <stack> using namespace std; 定义栈 可以定义任何类型的栈 ...

  10. [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表)

    [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表) 题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段 ...