1.組合式公式
設計思想
實驗要求輸入兩個數求組合數,首先要輸這兩個數才能進行程序,輸入后,根據組合數公式中全是階乘,使用遞歸比較方便,n!=n*(n-1)*......1,遞歸中返回n*zuheshu(n-1),實現階乘,最后調用階乘函數,輸出就完成程序。
程序流程圖

實驗源代碼
import java.util.Scanner;
public class Sz {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int a;
int b;
int c;
//定義所需的三個變量
System.out.println("輸入組合數公式所需的數:");
a=input.nextInt();
b=input.nextInt();
//對要計算的兩個變量進行賦值。
while(a==0||a<=b)
{
System.out.println("無法計算,重新輸入");
}
//判斷底下的除數是否可除
c=zuheshu(a)/(zuheshu(b)*zuheshu(a-b));//用遞歸函數對a,b進行賦值計算后傳給c。
System.out.println("組合數為"+c);//輸出組合數。
}
//創建遞歸函數,設置形參,還有int類型,用來返回int型的c。
public static int zuheshu(int n)
{
if(n==1||n==0)
{
return 1;
}
else
return n*zuheshu(n-1);//遞歸,自己引用自己進行計算。
}
}
實驗截圖

2.楊輝三角算組合數
設計思想
與前面的思想大致相同,但所需要遞歸調用的數學式子不同。值得注意的是調用函數的返回值要與定義的賦值元素相同,否則無法執行。
程序源代碼
import java.util.Scanner;
public class Sz2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int a;
int b;
System.out.println("輸入楊輝三角的兩個數:");
a=input.nextInt();
b=input.nextInt();
System.out.println(yhsjdg(a+1,b)-yhsjdg(a,b-1));
}
public static long yhsj(int n) {
if(n==1 || n==0){
return 1;
}
return n*yhsj(n-1);
}
public static long yhsjdg(int i,int j) {
long c= yhsj(i)/yhsj(j)/yhsj(i-j);
return c;
}
}
實驗截圖

3.遞推方法算組合數
實驗思想
前兩個都是遞歸求階乘后再次算出組合數,遞推直接求,直接返回 (zuheshu(n-1,k-1)+zuheshu(n-1,k));
程序源代碼
import java.util.Scanner;
public class Sz1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int a;
int b;
int c;
//定義所需的三個變量
System.out.println("輸入組合數公式所需的數:");
a=input.nextInt();
b=input.nextInt();
System.out.println("組合數為:"+zuheshu(a,b));
}
public static int zuheshu(int n,int k)
{
if(k==0)
{
return 1;
}
else if(n==k)
{
return 1;
}
else
return (zuheshu(n-1,k-1)+zuheshu(n-1,k));
}
}
實驗截圖

實驗中出現的問題
1.對於遞歸調用這種函數要想很久才能繞過彎來。
2.在判斷a,b為0或1時,返回值return應為1,一直返回0導致程序無法執行找不到錯誤。
3.楊輝三角的不熟悉導致第二個沒有思路可以下手。
4.漢諾塔問題
設計思路
先假設最簡單的有3個盤子,要把上面兩個放到中間B的位置,再把最底下的放到C位置,要把兩個放到B上面又要把第一個放到C上,第二個放到B上,再把第一個放到B上,最后就是把B上第一個的放到A,第二個放到C,再把A上的放到C,就完成了。這就是一種遞歸,假設有n個盤子,先把(n-1)放到B坐,把最下面的放到C,(n-1)中又把(n-2)放到B,再拿出最底下的(n-1),一直重復最后放完。
程序流程圖

程序源代碼
import java.util.Scanner;
public class Hannuota {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int m;
System.out.println("放入的盤子數:");
m=input.nextInt();
System.out.println("移動的步驟:");
buzhou(m,'A','B','C');
}
public static void buzhou(int n,char one,char two,char three)
{
if(n==1)
move(one,three);
else{
buzhou(n-1,one,three,two);
move(one,three);
buzhou(n-1,two,one,three);
}
}
public static void move(char x,char y)
{
System.out.println(x+"——>"+y);
}
}
實驗截圖

實驗問題
1.由於要遞歸兩次,所以導致該開始沒有實現。
2.溫馨提示就是c語言書中有操作步驟,可以作為參考。
5.回文數
實驗思想
回文數就是說正着讀,反着讀都一樣,也就是說如果只有一個字符,一定回文,兩個一樣的,一定回文,三個以上的話,最左邊和最右邊相同然后依次向里夾都相同就回文。“往里夾”就是要用遞歸的基本方式。這是這個程序的核心,整體的思路就是輸入字符串,然后進行調用回文的遞歸函數,判斷后,輸出。
實驗流程圖

程序源代碼
import java.util.Scanner;
public class Hw {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
String s;
System.out.println("輸入要判斷的字符:");
s=input.next();
System.out.println(huiwenshu(s));
}
public static boolean huiwenshu(String s)
{
int length = s.length();
for(int i=0;i<length/2;i++){
if(s.charAt(i)!=s.charAt(length-i-1)){
return false;
}
}
return true;
}
}
實驗截圖


