课后作业1:使用计算机计算组合数:
(1)使用组合数公式利用n!来计算
设计思想:用公式的方法求组合数,利用递归方法,求出阶乘n!,k!,(n-k)!,求出组合数的大小。
程序流程图:
源代码:
import java.util.Scanner;
import java.lang.Math.*;
import java.math.BigInteger;
public class Zuheshu
{
public static BigInteger jiecheng(int n)
{
if(n<0)
{
System.out.println("输入有误");
}
if(n==1||n==0)
{
return BigInteger.valueOf(1);
}
else
{
return BigInteger.valueOf(n).multiply(jiecheng((n-1)));
}
}
public static long calculateN(int n)
{
if(n==1 || n==0)
{
return 1;
}
return n*calculateN(n-1);
}
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的n
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的k
int k=scanner2.nextInt();
BigInteger x,y,z,d,result;
x=jiecheng(n);
y=jiecheng(k);
z=jiecheng(n-k);
d=y.multiply(z);//计算k!*(n-k)!
result=x.divide(d);//计算n!/(k!*(n-k)!)
System.out.println("组合数的结果是:"+result);//输出运算结果
}
}
结果截图:
(2)使用递推的方法用杨辉三角形计算
设计思想:用递推的方法,由前往后递推,利用杨辉三角形找出规律,利用二元数组求出组合数的大小。
程序流程图:
源代码:
import java.util.Scanner;
import java.lang.Math.*;
public class Zuheshu2
{
public static int n;
public static int k;
public static int c[][]=new int[100][100];
Zuheshu2 a=new Zuheshu2();
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的n
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的k
int k=scanner2.nextInt();
c[0][0]=1;//初始化
c[1][0]=1;//初始化
c[1][1]=1;//初始化
for(int i=2;i<=n;i++)
{
c[i][0]=1;
c[i][i]=1;//初始化每行 杨辉三角的两边的值
for(int j=1;j<=i;j++)
{
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
System.out.println("组合数的结果是:"+c[n][k]);
}
}
结果截图:
(3)使用递归的方法用组合数递推公式计算
设计思想:用递归函数的方法,由后往前调用递归公式,利用给出的组合数公式,初始化,求出组合数的大小,然后输出结果
程序流程图:
源代码:
import java.util.Scanner;
public class Zuheshu3
{
public static int n;
public static int k;
public static int c[][]=new int[100][100];
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的n
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的k
int k=scanner2.nextInt();
c[0][0]=1;//初始化
c[1][0]=1;//初始化
c[1][1]=1;//初始化
System.out.println("组合数的结果是:"+digui(n,k));
}
public static int digui(int n0,int k0)
{
if((k0==n0)||(k0==0))
{
return 1;
}
c[n0][k0]=digui(n0-1,k0)+digui(n0-1,k0-1);
return c[n0][k0];
}
}
结果截图:
课后作业2:
递归编程解决汉诺塔问题。用Java实现
设计思想:递归算法
当n=1时,将A上的盘子直接移动到C上
当n>=2时:
1,将A上n-1个盘子移动到B上(此步骤的解决办法与移动n阶盘子的方法完全一样
只是问题的规模减小1阶
2,将A上的一个盘子移动到C
3,将B上的n-1个盘子移动到C上。
源代码:
import java.util.Scanner;
public class Tower1
{
public static void tower(int n,char one,char two,char three)
{
if(n==1)
{
move(one,three,1);
}
else
{
tower(n-1,one,three,two);
move(one,three, n);
tower(n-1,two,one,three);
}
}
//输出
public static void move(char x,char y, int n)
{
System.out.println(x+"的第"+n+"盘移动到"+y);
}
public static void main(String[] args)
{
int level;
Scanner in = new Scanner(System.in);
System.out.println("请输入层数:");
level = in.nextInt();
Tower1.tower(level,'A','B','C');
}
}
结果截图:
课后作业3:使用递归方式判断某个字串是否是回文
设计思想:利用递归的方法,结合回文的定义,验证字符串是否为回文字符串
程序流程图:
源代码:
package com.resource.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class HuiWen
{
/**
* 递归方法判断一个string是否是回文
* 返回true表示当前字符串是一个回文字符串
* 返回false表示该字符串不是回文字符串
* @param args
*/
public static void main(String[] args)throws Exception
{
String str ="";
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in),256);
System.out.println("请输入待检验的字符串:");
str = br.readLine();
System.out.println("检查结果: " + huiwen(str,0,str.length()-1));
}
public static boolean huiwen(String s,int start,int end)
{
if(start == end) return true;
if(start > end)
{
System.out.println("您没有输入任何字符串!");
return false;
}
if(s.charAt(start) == s.charAt(end))
{
return huiwen(s,start+1,end-1);
}
else
{
return false;
}
}
}
结果截图