课后作业

 

课后作业1:

1.程序设计思想

第一种用公式的方法求组合数,利用递归方法,求出阶乘,求出组合数的大小。

第二种是用递推的方法,递推的方法是由前往后递推,利用杨辉三角形找出规律,利用二元数组求出组合数的大小。

第三种是用递归函数的方法,由后往前调用递归公式,利用给出组合数公式,初始化值,求出组合数的大小

2.程序流程图

 

3.程序源代码

 

第一种:

import java.util.Scanner;
import java.lang.Math.*;
import java.math.BigInteger;
public class ZuheNumber{
//组合数公式
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);//组合数的下标
       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);//计算k!*(n-k)!的结果
       result=x.divide(d);//计算n!/(k!*(n-k)!)的结果
       System.out.println("组合数的结果是:"+result);//输出运算结果

}
}

第二种:

import java.util.Scanner;
import java.lang.Math.*;
public class ZuheNumber1 {
public static int n;
public static int k;
public static int c[][]=new int[100][100];
ZuheNumber a=new ZuheNumber();
public static void main(String args[])
{
       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;//初始化
       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]);
}
}

第三种:

import java.util.Scanner;
public class ZuheNumber2 {
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);//组合数的下标
       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:

程序设计思想: 递归编程解决汉诺塔问题。用Java实现

程序流程图:

源代码:


import java.util.*;

public class HanoiTower {

public static void main(String[] args) {
// TODO Auto-generated method stub

@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
int n;
System.out.println("Please enter the number of your dished(Hanoi Tower):");
n=sc.nextInt();
System.out.println("The number of the times you need to move the dishes is:"+new HanoiTower().hanoiTower(n));

}


public int hanoiTower(int n)
{if(n==1) return 1;
else return hanoiTower(n-1)*2+1;
}

}

程序截图:

课后作业3:

程序设计思想:使用递归方式判断某个字串是否是回文( palindrome )

程序流程图:

源代码:

//Li Cuiyun,October 14,2016.
//用递归方法编程解决汉诺塔问题
package tutorial_3_5;
import java.util.*;

public class HanoiTower {

public static void main(String[] args) {
// TODO Auto-generated method stub

@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
int n;
System.out.println("Please enter the number of your dished(Hanoi Tower):");
n=sc.nextInt();
System.out.println("The number of the times you need to move the dishes is:"+new HanoiTower().hanoiTower(n));

}


public int hanoiTower(int n)
{if(n==1) return 1;
else return hanoiTower(n-1)*2+1;
}

}

程序截图:

 

posted on 2017-10-14 00:45  宛英东  阅读(220)  评论(0编辑  收藏  举报