1. 程式人生 > >遞歸的應用

遞歸的應用

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)); } } public
static 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;
    }
}
實驗截圖
技術分享

 

遞歸的應用