课后作业1:
1.设计思想:
(1)适用组合数公式:先用递归方法,求出阶乘,然后求出组合数的大小。
(2)使用递推的方法:递推是由前往后退,通过杨辉三角找出规律,利用二元数组求出组合数的大小。
(3)使用递归的方法:由前往后调用递归公式,利用组合数公式,初始化值,求出组合数的大小。
2.程序流程图:
3.源程序代码:
(1)使用组合数公式的代码:
package zuheshu;
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) {
// TODO Auto-generated method stub
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);
int k=scanner2.nextInt();
BigInteger x,y,z,d,result;
x=jiecheng(n);
y=jiecheng(k);
z=jiecheng(n-k);
d=y.multiply(z);
result=x.divide(d);
System.out.println("组合数的结果是:"+result);
}
}
结果截图:
(2)使用递推的方法用杨辉三角计算
代码:
package zuheshu;
import java.util.Scanner;
import java.lang.Math.*;
public class Zuheshu1 {
public static int n;
public static int k;
public static int c[][]=new int[100][100];
Zuheshu a=new Zuheshu();
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);
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)使用递归的方法用组合数递推公式
代码:
package zuheshu;
import java.util.Scanner;
public class Zuheshu2 {
public static int n;
public static int k;
public static int c[][]=new int [100][100];
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的下标
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的上标
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:
1.设计思想:
一、建立一个Hannuota的类,储存环的个数以及移动时所需要的变量;
二、建立一个move的函数,用来实现移动方式的列举
三、利用递归方法解决此问题,用条件语句实现此方法。
2.程序流程图:
3.源程序代码:
import javax.swing.JOptionPane;
public class Hannuota {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s=" ";
s=JOptionPane.showInputDialog("请输入环的个数:");
int j=0;
char a='a',b='b',c='c';
j=Integer.parseInt(s);
move(j,a,b,c);
}
public static void move(int m,char a,char b,char c)
{
if(m==1)
{
System.out.println(a+"->"+c);
}
else
{
move(m-1,a,c,b);
System.out.println(a+"->"+c);
move(m-1,b,a,c);
}
}
}
4.结果截图:
课后作业3:
1.设计思想:
一、建立一个Palindrome类,用来储存全局变量整型数据和全局变量数组
二、输入字符串,令其长度为数组长度,将字符串转换为相应数组,用于比较对应位置字符是否相等。
三、从字符数组第一个函数开始比较,因为第一个字符下标为0,所以0为参数。
四、利用递归结束的条件判断是否是回文数。满足任何一个条件,结束递归。
2.程序流程图:
3.源程序代码:
import java.util.Scanner;
public class Palindrome
{
private static int len;//全局变量整型数据
private static char p[];//全局变量数组
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
String str;
str=sc.nextLine();
len=str.length();//令len的值为数组长度
p=str.toCharArray();//将字符串转换为相应数组,用于比较对应位置字符是否相等。
//从字符数组第一个函数开始比较。因为第一个字符下标为0,所以以0为参数:if(isPalindrome(0))
if(isPalindrome(0)) System.out.println(str+" is a palindrome!");
else System.out.println(str+" is not a palindrome!");
}
public static boolean isPalindrome(int n)
{
if(n>=len/2) return true; //递归结束的条件之1:整个字符串的字符都一一对比完了,没有出现字符不等的情况,故该字串是回文。
else if(p[n]==p[len-1-n]) return isPalindrome(n+1);
else return false; //递归结束的条件之2:字符串的字符一一对比过程中,出现字符不等的情况,故该字串不是回文。
} //注:满足任何一个递归结束条件,则结束递归了。这时候系统就着手于一层一层向上返回数据。
}
4.结果截图: