一、 课程作业01_1
1. 实验题目
使用组合数公式利用n!来计算⒈
2. 设计思想
设计一个可以求n!的方法,提示用户输入n和k两个变量,若输入的数符合要求,调用求阶乘的方法,套用公式,求出结果。
3. 程序流程图
4. 源程序代码
import java.util.Scanner;
public class Homework02_1 {
public static void main(String[] args)
{
Homework02_1 h=new Homework02_1();
h.go();
}
public void go()
{
System.out.println("请输入n和k:");
@SuppressWarnings("resource")
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt(),k=scanner.nextInt();
if(n>=k&&k>=0&&n>0)//判断n和k是否符合要求
System.out.println("C("+n+","+k+")="+f(n)/f(k)/f(n-k));
else System.out.println("输入的数不符合要求");
}
public int f(int n)//递归求阶乘
{
if(n==0||n==1)
return 1;
else
return n*f(n-1);
}
}
5. 结果截图
二、 课程作业01_2
1. 实验题目
使用递推的方法用杨辉三角形计算
2. 设计思想
根据用户输入的数创建一个数组,三角形,用数组把三角形,用递推法算出杨辉三角形中的每一个数,存在数组中,然后C(n,k)就等于数组中第n-1行k-1列的数。
3. 程序流程图
4. 源程序代码
import java.util.Scanner;
public class Homework02_1_2 {
public static void main(String[] args)
{
Homework02_1_2 h=new Homework02_1_2();
h.go();
}
public void go()
{
System.out.println("请输入n和k:");
@SuppressWarnings("resource")
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt(),k=scanner.nextInt();
if(n>=k&&k>=0&&n>0)//判断n和k是否符合要求
System.out.println("C("+n+","+k+")="+createArrayAndReturn(n,k));
else System.out.println("输入的数不符合要求");
}
public int createArrayAndReturn(int n,int k)
{
int [][]array=new int[n+1][];
for(int i=0;i<=n;i++)
{
array[i]=new int[i+1];//创建一个第i行有i个元素的数组
}
for(int i=0;i<n+1;i++)
{
array[i][0]=1;//每行第一个和最后一个元素都为1
array[i][i]=1;
for(int j=1;j<i;j++)//其他的元素都为其上一行对应肩上两个元素的和
{
array[i][j]=array[i-1][j-1]+array[i-1][j];
}
}
return array[n][k];
}
}
5. 结果截图
三、 课程作业01_3
1. 实验题目
使用递归的方法用组合数递推公式计算
2. 设计思想
声明一个可以求C(n,k)值的函数,每次递推套用杨辉三角形公式,直到n=k或者k=1。
3. 程序流程图
4. 源程序代码
import java.util.Scanner;
public class Homework02_1_2 {
public static void main(String[] args)
{
Homework02_1_2 h=new Homework02_1_2();
h.go();
}
public void go()
{
System.out.println("请输入n和k:");
@SuppressWarnings("resource")
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt(),k=scanner.nextInt();
if(n>=k&&k>=0&&n>0)//判断n和k是否符合要求
System.out.println("C("+n+","+k+")="+C(n,k));
else System.out.println("输入的数不符合要求");
}
public int C(int n,int k)//递推法运用杨辉三角形公式
{
if(k==1)
return n;
else if(n==k)
return 1;
else return C(n-1,k-1)+C(n-1,k);//杨辉三角形公式
}
}
5. 结果截图
四、 课程作业02
1. 实验题目
递归编程解决汉诺塔问题。用Java实现
2. 设计思想
使用递归方法,定义一个move(char,char)方法和一个hanoi ( int,char,char,char)方法。
第一步将A上n-1个盘子借助C移到B上
第二步将A上一个盘子移到C上
第三步将B上n-1个盘子借助A移到C上
3. 程序流程图
4. 源程序代码
import java.util.Scanner;
public class Homework02_2 {
public static void main(String[] args)
{
Homework02_2 h=new Homework02_2();
h.go();
}
public void go()
{
System.out.println("请输入盘子的个数n:");
@SuppressWarnings("resource")
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
if(n>=0)//判断n是否符合要求
{
System.out.println("移动"+n+"个盘子的步骤为:");
hanoi(n,'A','B','C');
}
else System.out.println("输入的数不符合要求");
}
public void hanoi(int m,char one,char two,char three)
{
if(m==1)
move(one,three);
else
{
hanoi(m-1,one,three,two);//第一步将A上n-1个盘子借助C移到B上
move(one,three);//第二步将A上一个盘子移到C上
hanoi(m-1,two,one,three);//第三步将B上n-1个盘子借助A移到C上
}
}
public void move(char x,char y)
{
System.out.println(x+"->"+y);
}
}
5. 结果截图
五、 课程作业03
1. 实验题目
使用递归方式判断某个字串是否是回文( palindrome )
2. 设计思想
取得用户输入的字符串,调用String的length()函数获得字符个数,声明一个数组,使用for循环和charAT函数将数组初始化。
之后使用一个返回类型为boolean的递归函数,以循环次数和判断对应位置数字是否相等决定是否结束递归函数。
3. 程序流程图
4. 源程序代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Homework02_3 {
public static void main(String[] args)
{
Homework02_3 h=new Homework02_3();
try {//处理有异常的方法
h.go();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void go() throws IOException//声明这个方法是有风险的
{
String input=null;
System.out.println("输入字符串:");
BufferedReader is=new BufferedReader(new InputStreamReader(System.in));
input=is.readLine();
if(!input.isEmpty())//判断n是否符合要求
{
int [] array=new int[input.length()];
for(int i=0;i<input.length();i++)//将字符串中的每一个字符取出,赋给数组
{
array[i]=input.charAt(i);
}
System.out.println("是回文数?"+ifHuiWen(array,0));
}
else System.out.println("输入的数不符合要求");
}
public boolean ifHuiWen(int[] a,int l)//递归法判断是否是回文数
{
if(l==a.length/2)//执行到一定次数的时候还没有返回false,说明就是回文数了
return true;
if(a[l]==a[a.length-l-1])
return ifHuiWen(a,l+1);
else return false;
}
}
5. 结果截图