1. 程式人生 > >【Java】遞歸遞推的應用

【Java】遞歸遞推的應用

程序 賦值 sys next 關系 src 大小 blog 圓盤

利用階乘公式來計算組合式:

程序設計思想:

根據公式來計算組合數的大小,從鍵盤輸入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】遞歸遞推的應用