課堂作業02-2
一、 課程作業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. 結果截圖
課堂作業02-2