方法---課程作業02
課後作業1
(1)使用組合數公式
1、程序設計思想
利用遞歸求n的階乘,遞歸終止條件為:if(n==1||n==0) f=1;不終止則執行:f=n*fac(n-1);調用該方法分別求出n!、k!、(n-k)!,再利用組合數公式即可求出組合數。
2、流程圖
3、源程序代碼
import java.util.*;
public class Combination {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("從n個不同元素中取出
int n,k,t;
Scanner input=new Scanner(System.in);
n=input.nextInt();
k=input.nextInt();
input.close();
t=c(n,k);
System.out.println("從"+n+"個不同元素中取出"+k+"個元素,組合數為:"+t);
}
public static int c(int n,int k) //從n個不同元素中取出
{
int n1,k1,nk1,result;
n1=fac(n);
k1=fac(k);
nk1=fac(n-k);
result=n1/(k1*nk1);
return result;
}
public static int fac(int n) //求n的階乘
{
int f;
if(n==1||n==0)
f=1;
else f=n*fac(n-1);
return f;
}
}
4、截圖
(2)使用遞推的方法用楊輝三角計算
1、程序設計思想
先動態開辟一個足夠大的二維數組,按楊輝三角中數的規律給該數組賦值,因為楊輝三角第n行第k列的元素為從n-1個不同元素中取k-1個元素的組合數,所以可根據該數組算出想求的組合數。
2、流程圖
3、源程序代碼
import java.util.*;
public class Combination {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("從n個不同元素中取出k個元素,請分別輸入n與k的值:");
int n,k,t;
Scanner input=new Scanner(System.in);
n=input.nextInt();
k=input.nextInt();
input.close();
t=yangHui(n,k);
System.out.println("從"+n+"個不同元素中取出"+k+"個元素,組合數為:"+t);
}
public static int yangHui(int n,int k) //求楊輝三角中第n行第k列的元素
{
int i,j;
int arr[][]=new int [100][];
for(i=0;i<arr.length;i++)
{arr[i]=new int [i+1];
arr[i][0]=1;
arr[i][i]=1;}
for(i=2;i<arr.length;i++)
{
for(j=1;j<arr[i].length-1;j++)
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
return arr[n][k];
}
}
4、截圖
(3)使用遞歸的方法用組合數遞推公式計算
1、程序設計思想
組合數的遞推公式為c(n,k)=c(n-1,k-1)+c(n-1,k),創建一個使用遞歸方法的函數,遞歸終止條件為:if(n==0) return 1;else if(n==1) return i;else if(n==k) return 1;調用該函數即可求出組合數。
2、流程圖
3、源程序代碼
import java.util.Scanner;
public class Combination {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("從n個不同元素中取出k個元素,請分別輸入n與k的值:");
int n,k,t;
Scanner input=new Scanner(System.in);
n=input.nextInt();
k=input.nextInt();
input.close();
t=c(n,k);
System.out.println("從"+n+"個不同元素中取出"+k+"個元素,組合數為:"+t);
}
public static int c(int n,int k) //從n個不同元素中取出k個元素
{
if(k==0) return 1;
else if(n==1) return 1;
else if(n==k) return 1;
else return c(n-1,k-1)+c(n-1,k);
}
}
4、截圖
課後作業2
遞歸編程解決漢諾塔問題。
1、程序設計思想
假設要從A移動n個盤子到B,運用遞歸的方法,只需先將n-1個盤子借助C從A移到B,再將剩下的一個盤子從A直接移到C,最後再將B上的n-1個盤子借助A從B移到C即可。遞歸終止條件為:if(number==1) move(one,three)。
2、流程圖
3、源程序代碼
import java.util.*;
public class HanLuo {
public static void main(String args[])
{
System.out.print("請輸入盤子的數量:");
Scanner input=new Scanner(System.in);
int number=input.nextInt();
input.close();
hanluo(number,‘A‘,‘B‘,‘C‘);
}
public static void hanluo(int number,char one,char two,char three) //將number個盤子借助"two"從"one"移到"three"
{
if(number==1) move(one,three);
else {
hanluo(number-1,one,three,two);
move(one,three);
hanluo(number-1,two,one,three);
}
}
public static void move(char a,char b)
{
System.out.println(a+"->"+b);
}
}
4、截圖
課後作業3
使用遞歸方式判斷某個字符串是否是回文
1、程序設計思想
輸入一個字符串str,int n=str.length(),再利用str.length-n與str.length()-str.length()+n-1分別求出該字符串的第一個以及最後一個字符,將其進行比較,遞歸終止條件為:if(s1==s2&&L1>(length()/2-1)&&L1<L2) j=1; else if(s1!=s2&&L1>(length()/2-1)&&L1<L2) j=0;
2、流程圖
3、源程序代碼
import java.util.Scanner;
public class Palindrome {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入字符串:");
String str;
int n;
Scanner input=new Scanner(System.in);
str=input.nextLine();
input.close();
n=str.length();
int j=judge(str,n);
if(j==1) System.out.println(str+"是回文字符串");
else System.out.println(str+"不是回文字符串");
}
public static int judge(String str,int n)
{
int j=0;
if(str==""||str==null)
j=0;
int l1,l2;
char s1,s2; //用字符串的第一個字符與最後一個字符比較,第二個與倒數第二個比較,依此類推
l1=str.length()-n;
l2=str.length()-l1-1;
s1=str.charAt(l1);
s2=str.charAt(l2);
if(s1==s2&&l1>=(str.length()/2-1)&&l1<l2) //比較到最中間的兩個數是遞歸停止條件
j=1;
else if(s1!=s2&&l1>=(str.length()/2-1)&&l1<l2)
j=0;
else j=judge(str,n-1);
return j;
}
}
4、截圖
方法---課程作業02