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; } }
實驗截圖