遞歸的應用
阿新 • • 發佈:2017-10-14
ole out turn import ring oid ria 編程 ner
作業一
(1)使用組合數公式利用n!來計算
設計思想
先寫出計算階乘的函數,這個函數運用了遞歸的方法,
然後再根據公式求出組合數。
程序流程圖
程序源代碼
import java.util.Scanner; public class Combination_N { public static void main(String[] args) { int up_num=1,down_num=1;//up_num表示組合數的上數,down_num表示組合輸的下數 Scanner scanner=new Scanner (System.in); while(true) { System.out.println("請輸入組合數上邊的數"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("請輸入組合數下邊的數"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.println(combin(up_num,down_num)); } } publicstatic int factorial (int n)//求N! { if(n>1) return factorial(n-1)*n; else return 1; } public static int combin(int up,int down)//求組合數 { return factorial(down)/(factorial(up)*factorial(down-up)); } }
程序截圖
(2)使用遞推的方法用楊輝三角形計算
程序設計思想
創建二維數組,運用楊輝三角的思想遞推求組合數
程序流程圖
源代碼
import java.util.Scanner; public class Zuheshu3 { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); int up_num=1,down_num=1;//up_num表示組合數的上數,down_num表示組合輸的下數 while(true) { System.out.println("請輸入組合數上邊的數"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("請輸入組合數下邊的數"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.print(Combination(up_num,down_num)); } } public static int Combination(int up,int down)//計算組合數 { int a[][]=new int[down+1][down+1]; int i,j; for(i=0;i<=down;i++) a[i][0]=1; for(i=1;i<=down;i++) a[i][i]=1; for(i=2;i<=down;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; return a[down][up]; } }
(3)使用遞歸的方法用組合數遞推公式
設計思想
直接把所給的公式寫成函數,並采取遞歸的方法,函數結束的條件是組合數的上下兩個數相等,或者上變數是1
程序流程圖
import java.util.Scanner; public class YH_tri { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); int up_num=1,down_num=1;//up_num表示組合數的上數,down_num表示組合輸的下數 while(true) { System.out.println("請輸入組合數上邊的數"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("請輸入組合數下邊的數"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.print(Combination(up_num,down_num)); } } public static int Combination(int up,int down)//計算組合數 { int Com; if(up==1) return down; else if(up==down) return 1; else return(Combination(up,down-1)+Combination(up-1,down-1)); } }
運行截圖
作業2:遞歸編程解決漢諾塔問題
程序設計思想
經分析得移動每個盤子都需移動他的上邊的盤子;由此產生遞歸的條件求組合數
程序流程圖
程序源碼
import java.util.Scanner; public class Hanoi { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int num=1; System.out.println("請輸入漢諾塔的層數"); if(scanner.hasNextInt()) { num=scanner.nextInt(); } System.out.println("操作步驟如下(其中A表示起始塔,B表示借助的塔,C表示最終塔)"); hanoi(num,‘A‘,‘B‘,‘C‘); } public static void hanoi(int num,char one,char two,char three)//one表示起始塔,two表示移動過程借助的塔,three表示最終的位置塔 { if(num==1) { move(one,three); } else { hanoi(num-1,one,three,two); move(one,three); hanoi(num-1,two,one,three); } } public static void move(char from,char to)//from表示移動的初位置,to表示末位置 { System.out.println(from+"->"+to); } }
實驗截圖
作業3
設計思想
先確定字符串的長度,然後即可比較第一個和最後一個字符,然後再去掉原來字符串的首尾字符,在進行比較
程序流程圖
程序源碼
import java.util.Scanner; public class Palindrome { public static void main(String[] args) { String str=" "; Scanner input =new Scanner(System.in); while(true) { System.out.println("請輸入一段話"); if(input.hasNext()) str=input.next(); if(huiwen(str)) { System.out.print("這段話是回文"); } else System.out.print("這段話不是回文"); } } public static boolean huiwen(String str) { int len; len=str.length(); if(len==1||len==0) return true; else if(str.charAt(0)==str.charAt(len-1)) { return huiwen(str.substring(1, len-1)); } else return false; } }
實驗截圖
遞歸的應用