一、        课程作业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.  结果截图