【Java】遞歸遞推的應用
利用階乘公式來計算組合式:
程序設計思想:
根據公式來計算組合數的大小,從鍵盤輸入n,k的值,設計一個計算階乘的大小,如果輸入的數a為1或0,則直接return 1,否則運用遞歸,計算a-1的階乘,直到a為1時,遞歸結束。
程序流程圖:
程序源代碼:
public static void main(String args[]) { int n ,k,c; Scanner in=new Scanner(System.in); System.out.print("輸入從n個數中選k個數中n,k的值:"); n=in.nextInt(); k=in.nextInt(); System.out.println("結果為:"); c=jiecheng(n)/(jiecheng(k)*jiecheng(n-k)); System.out.println(c); }
public static int jiecheng(int x)
{
int y=1;
if(x==1||x==0)
y=1;
else y=jiecheng(x-1)*x;
return y;
}
根據楊輝三角遞推求組合數
程序設計思想:
根據楊輝三角的規律,得出楊輝三角的第n行的第m個的值等於該位置的元素的上一行的左右兩個輸的和,然後根據楊輝三角與組合數的關系即c(n,m)等於楊輝三角的第n+1的第m+1個元素的值,根據這個來寫出組合數的值。
程序流程圖:
程序源代碼:
public static void main(String args[]) { Scanner sc=new Scanner(System.in); System.out.print("輸入N值:"); int n=sc.nextInt(); System.out.print("輸入K值:"); int k=sc.nextInt(); int[][] a=new int[n+1][n+1]; for(int i=0;i<n+1;i++) {for(int j=0;j<=i;j++) { if(j==0||j==i) { a[i][j]=1; System.out.print(a[i][j]+" "); } else { a[i][j]=a[i-1][j-1]+a[i-1][j]; System.out.print(a[i][j]); System.out.print(" "); } } System.out.println(); } if(n<2||k==1) System.out.println("num=1"); else System.out.println("num="+a[n][k-1]+"="+a[n-1][k-2]+"+"+a[n-1][k-1]); }
運用公式計算組合數:
程序設計思想:
輸入n,m,兩個數(來組成要求出的組合數)(n>m),如果m=1,則輸出結果n,如果m!=1,則進入遞歸,運用公式,直到進行到n-m=1的時候,結束遞歸,輸出結果。
程序流程圖
程序源代碼:
public static void main(String args[]) { Scanner sc=new Scanner(System.in); System.out.print("輸入N值:"); int n=sc.nextInt(); System.out.print("輸入K值:"); int k=sc.nextInt(); System.out.println("結果為:"+C(n,k)); } public static int C(int n,int k) { if(n<0||k<0||n<k) return 0; if(n==k) return 1; if(k==1) return n; return C(n-1,k)+C(n-1,k-1); }
用Java實現漢諾塔:
程序設計思想:
1.首先輸入盤子的數量n,如果盤子的數量是1,則直接將編號為1的圓盤從A移到C,遞歸結束。
2.否則:
遞歸,將A上編號為1至n-1的圓盤移到B,C做輔助塔;
直接將編號為n的圓盤從A到C;
遞歸,將B上的編號為1至n-1的圓盤移到C,A做輔助塔。
程序流程圖:
程序源代碼:
public static void main(String[] args) { @SuppressWarnings("resource") Scanner sc=new Scanner(System.in); int n; System.out.println("Please enter the number of your dished(Hanoi Tower):"); n=sc.nextInt(); System.out.println("The number of the times you need to move the dishes is:"+new HanoiTower().hanoiTower(n)); HanoiTower HanoiTower = new HanoiTower(); HanoiTower.move(n, ‘A‘, ‘B‘, ‘C‘); } public int hanoiTower(int n) { if(n==1) return 1; else return hanoiTower(n-1)*2+1; } public void move(int n, char a, char b, char c) { if (n == 1) System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); else { move(n - 1, a, c, b); System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); move(n - 1, b, a, c); } }
隨意輸入一個任意大小的字符串,判斷他是不是回文字符串。
程序設計思想:
從鍵盤隨意輸入一個字符串,並將其賦值給一個數組,然後用遞歸進行,若i=j,肯定是遞歸,否則從數組的首元素與尾元素進行比較,若相等,則進行i++與j--,不斷向中間靠攏,直到達到判斷條件 n>=len/2 ,中間若有一次不符合判斷,直接跳出遞歸,結束進程,輸出不是回文字符串。
程序設計流程圖:
程序源代碼:
public class huiwen { private static int len; private static char p[]; public static void main(String args[]){ Scanner sc=new Scanner(System.in); String str; str=sc.nextLine(); len=str.length(); p=str.toCharArray(); if(huiwen(0)) System.out.println(str+" is a palindrome!"); else System.out.println(str+" is not a palindrome!"); } public static boolean huiwen(int n){ if(n>=len/2) return true; if(p[n]==p[len-1-n]) return huiwen(n+1); else return false; } }
【Java】遞歸遞推的應用