課後作業02
用Java實現漢諾塔:
程序設計思想:
1.首先輸入盤子的數量n,如果盤子的數量是1,則直接將編號為1的圓盤從A移到C,遞歸結束。
2.否則:
遞歸,將A上編號為1至n-1的圓盤移到B,C做輔助塔;
直接將編號為n的圓盤從A到C;
遞歸,將B上的編號為1至n-1的圓盤移到C,A做輔助塔。
程序流程圖:
程序源代碼:
package tourial2;
import java.util.Scanner;
public class Hanio {
public static int m=0;
public static void move (String A,int n,String C)
{
System.out.println(++m+": "+n+","+A+"->"+C);
}
public static void Hanio (int n,String A,String B,String C)
{
if(n==1)
move(A,1,C);
else
{
Hanio(n-1,A,C,B);
move(A,n,C);
Hanio(n-1,B,A,C);
}
}
public static void main(String[] args) {
// TODO 自動生成的方法存根
String A ,B ,C ;
Scanner input=new Scanner(System.in
System.out.println("請輸入三個盤子的名稱:");
A=input.next();
B=input.next();
C=input.next();
System.out.println("請輸入盤子的個數:");
int n=input.nextInt();
Hanio(n,A,B,C);
}
}
程序截圖:
問題二:隨意輸入一個任意大小的字符串,判斷他是不是回文字符串。
程序設計思想:
從鍵盤隨意輸入一個字符串,並將其賦值給一個數組,然後用遞歸進行,若i=j,澤肯定是遞歸,否則從數組的首元素與尾元素進行比較,若相等,則進行i++與j--,不斷向中間靠攏,直到達到判斷條件
程序設計流程圖:
程序源代碼:
package tourial2;
import java.util.Scanner;
public class huiwenshu {
public static void huiwen(char a[],int j,int i)
{
if(i>=j)
{
if(a[i]==a[j])
System.out.println("是回文");
System.exit(0);
}
if(a[i] == a[j])
huiwen(a,--j,++i);
else
{
System.out.println("他不是回文數!");
System.exit(0);
}
}
public static void main(String[] args)
{
String s;
int j;
int i=0;
Scanner input=new Scanner(System.in);
System.out.println("請輸入 一個字符串:");
s=input.next();
char a[];
a=s.toCharArray();
j=a.length-1;
for( int k=0;k<s.length();k++)
{
System.out.print (a[k]);
}
huiwen(a,j,i);
}
}
程序截圖:
根據楊輝三角遞推求組合數
程序設計思想:
根據楊輝三角的規律,得出楊輝三角的第n行的第m個的值等於該位置的元素的上一行的左右兩個輸的和,然後根據楊輝三角與組合數的關系即c(n,m)等於楊輝三角的第n+1的第m+1個元素的值,根據這個來寫出組合數的值。
程序流程圖:
程序源代碼:
package tourial2;
import java.util.Scanner;
public class yanghuisanjiao
{
public static void yanghuisanjiao(int n,int m)
{
if(m==1)
{
System.out.println("輸出結果為:");
System.out.println(n);
}
else
{
n=n+1;
int a[][] = new int [n][n];
System.out.println(1);
for(int i=0;i<n;i++)
a[i][0]=1;
for(int i=1;i<n;i++)
{
System.out.print(1+" ");
for(int j=1;j<=i;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
System.out.print(" "+a[i][j]);
}
System.out.println();
}
System.out.println();
System.out.println("輸出結果:");
System.out.println(a[n-1][m]);
}
}
public static void main(String[] args) {
int x,y;
Scanner input=new Scanner(System.in);
System.out.println("請輸入第一個數:");
x=input.nextInt();
System.out.println("請輸入第二個數:");
y=input.nextInt();
while(x>y)
{
System.out.println("請重新輸入:");
System.out.println("請輸入第一個數:");
x=input.nextInt();
System.out.println("請輸入第二個數:");
y=input.nextInt();
}
yanghuisanjiao(y,x);
}
}
程序截圖:
利用階乘公式來計算組合式:
程序設計思想:
根據公式
來計算組合數的大小,從鍵盤輸入n,m的值,設計一個計算階乘的大小,如果輸入的數a為1或0,則直接return 1,否則運用遞歸,計算a-1的階乘,直到a為1時,遞歸結束。
程序流程圖:
階乘的流程圖:
程序的源代碼:
package tourial2;
import java.math.BigInteger;
import java.util.Scanner;
public class zuheshu {
public static BigInteger calculateN2(int n) {
if(n==1 || n==0){
return BigInteger.valueOf(1);
}
return BigInteger.valueOf(n).multiply(calculateN2((n-1)));
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("請輸入N1:");
int number1=scanner.nextInt();
BigInteger f1=calculateN2(number1);
//System.out.println(number1+"!="+calculateN2(number1));
System.out.print("請輸入N2:");
int number2=scanner.nextInt();
BigInteger f2=calculateN2(number2);
BigInteger f3=calculateN2(number1-number2);
//System.out.println(number2+"!="+calculateN2(number2));
BigInteger f4=f2.multiply(f3);
BigInteger f5= f1.divide(f4);
System.out.println("組合輸的結果是:"+f5);
}
}
程序截圖:
運用公式計算組合數:
程序設計思想:
輸入n,m,兩個數(來組成要求出的組合數)(n>m),如果m=1,則輸出結果n,如果m!=1,則進入遞歸,運用公式,直到進行到n-m=1的時候,結束遞歸,輸出結果。
程序流程圖:
程序源代碼:
package tourial2;
import java.util.Scanner;
public class gongshi {
public static int yang(int n,int m)
{
int b;
if(m!=1)
{
while(n-m==1)
{
return n;
}
b=yang(n-1,m-1)+yang(n-1,m);
}
else
b=n;
return b;
}
public static void main(String[] args) {
int n,m;
Scanner input=new Scanner(System.in);
System.out.println("請輸入兩個數:");
n=input.nextInt();
m=input.nextInt();
System.out.println("輸出結果:"+yang(n,m));
}
}
程序截圖:
課後作業02