Java上机实验二
课后作业1:(1)使用组合数公式利用n!来计算
设计思想:设计一个方法,用来计算n的阶乘,方法参数为一个long类型变量。用递归方法实现计算阶乘计算,当传入参数为0或者1时为递归最后条件,不满足条件时进行递归调用,直到符合。然后在主函数将组合数公式表示出来进行计算。
程序流程图:
程序源代码:
import java.util.Scanner;
//(1)
public class zuheshu {
static public long jiecheng(long n)
{
long m=0;
if(n==0||n==1)
{
m=1;
}
else
{
m=n*jiecheng(n-1);
}
return m;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
long jieshu,dishu,p;
System.out.println("请输入底数:\n");
dishu=input.nextLong();
System.out.println("请输入阶数:\n");
jieshu=input.nextLong();
p=jiecheng(dishu)/(jiecheng(jieshu)*jiecheng(dishu-jieshu));
System.out.println("结果为:\n");
System.out.println(p);
}
}
结果截图:
(2)使用递推方法用杨辉三角形计算:
设计思想:定义一个二维数组,用来表示底数和阶数,数组首元素定为1,定义循环体,表示出公式,一层层逐渐递推到数组的首元素,实现计算。
程序流程图:
程序源代码:
import java.util.Scanner;
//(2)
public class yanghui {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
long a[][]=new long[30][30];
System.out.println("请输入底数:\n");
int n=input.nextInt();
System.out.println("请输入阶数:\n");
int k=input.nextInt();
a[0][0]=1;
int i,j;
for(i=1;i<30;i++)
{
for(j=1;j<=i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
System.out.println("得到的结果为:\n");
System.out.println(a[n+1][k+1]);
}
}
结果截图:
(3)使用递归的方法用组合数递推公式计算:
设计思想:设计一个方法,当传入的底数或者阶数为1时为递归的最后条件,如果不满足则进行递归调用,两个参数逐渐降低,直到符合底数或者阶数为1的条件。
程序流程图:
程序源代码:
import java.util.Scanner;
//(3)
public class jiecheng {
static public long jiecheng(int n,int k)
{
if(n==1||k==1)
{
return 1;
}
else
{
return jiecheng(n-1,k-1)+jiecheng(n-1,k);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
System.out.println("请输入底数:\n");
int n=input.nextInt();
System.out.println("请输入阶数:\n");
int k=input.nextInt();
long num=jiecheng(n,k);
System.out.println("得到的结果为:");
System.out.println(num);
}
}
结果截图:
课后作业2.递归编程解决汉诺塔问题
设计思想:将n个盘子从A座移到C座可以分解为三步:
(1)将A上n-1个盘子借助C座先移到B座
(2)将A座上剩下的一个盘移到C座
(3)将n-1个盘从B座借助A座移到C座上
程序流程图:
程序源代码:
import java.util.Scanner;
public class hannuota {
public static void move(char x,char y)
{
System.out.println(x+"-->"+y);
}
static public void hanoi(int n,char one,char two,char three)
{
if(n==1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
System.out.println("请输入塔层数:\n");
int n=input.nextInt();
hanoi(n,'A','B','C');
}
}
结果截图:
课后作业3.使用递归方式判断某个字串是否是回文。
设计思想:首先输入一个字符串,运用函数判断字符串的位数,如果是单数则中间那个字符可以不进行判断,双数对称进行判断是否相等。在这个过程中需要将字符串转化为一个char类型的数组,用于比较。
程序流程图:
程序源代码:
import java.util.Scanner;
public class huiwen {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
String num="abc";
System.out.println("请输入字符串:\n");
num=input.next();
int a=num.length();
char[]b=num.toCharArray();//定义一个字符数组存放字符串每一位的字母
int i,c,flag=0;
c=a;
if(c%2==0)
{
for(i=0;i<c/2;i++)
{
if(b[i]==b[a-1])
{
a=a-1;
}
else
{
flag=1;//旗帜变量为1表示不是回文数
}
}
if(flag==0)
{
System.out.println("该字符串是回文字符串");
}
else
{
System.out.println("该字符串不是回文字符串");
}
}
else
{
for(i=0;i<(c-1)/2;i++)
{
if(b[i]==b[a-1])
{
a=a-1;
}
else
{
flag=1;//旗帜变量为1表示不是回文数
}
}
if(flag==0)
{
System.out.println("该字符串是回文字符串");
}
else
{
System.out.println("该字符串不是回文字符串");
}
}
}
}
结果截图: