1. 程式人生 > >課後作業——遞歸(組合數、漢諾塔、回文)

課後作業——遞歸(組合數、漢諾塔、回文)

bigint 遞歸函數 指定 lang ole 作業1 eof 2-2 image

課後作業1

使用組合數公式利用n!來計算

一、 程序設計思想

定義n,k,輸入並檢測輸入的值是否是整數,如果n>k,調用計算階乘的函數,計算並輸出結果。階乘計算函數使用遞歸的思想,並使用的是BigInteger類;

二、 程序流程圖

技術分享

三、 源代碼

import java.util.Scanner;
import java.math.BigInteger;
public class CombinatorialNumber1 {
    //信1605-3 20163693 王曉丹
    public static void main(String[] args) {
        Scanner input
=new Scanner(System.in); System.out.println("請輸入組合數的n,k,以便計算n!/k!*(n-k)!");//提示用戶輸入 int n=0,k=0; if(input.hasNextInt())//檢測輸入的是否是整數 { n=input.nextInt(); } else { System.out.println("您輸入的數據有誤!"); System.exit(0); }
if(input.hasNextInt())//檢測輸入的是否是整數 k=input.nextInt(); else { System.out.println("您輸入的數據有誤!"); System.exit(0); } if(n>=k)//檢測n是否大於k System.out.println(n+"!/"+k+"!*"+(n-k)+"!="+calculate(n).divide(calculate(k)).divide(calculate((n-k))));//
調用 else { System.out.println("輸入錯誤n<k!"); System.exit(0); } } public static BigInteger calculate(int number)//計算大數據階乘 { if(number==1||number==0) return BigInteger.valueOf(1); return BigInteger.valueOf(number).multiply(calculate((number-1))); } }



四、 結果截圖

技術分享

五、 實驗總結

使用BigInteger類計算大數據,那麽加減乘除都要使用BigInteger的類對象進行計算,例如乘使用multiply,除使用divide;題幹要求輸入整數,那麽就要檢測輸入的數據類型是否正確。

課後作業1

使用遞推的方法用楊輝三角形計算

一、程序設計思想

提示用戶輸入n和k的值,定義n,k,並檢測輸入的數是否是整數,檢測是否n>=k,如果不符合退出,如果都符合要求,定義一個n*n的二維數組,用來楊輝三角的數值,利用for循環嵌套給數組賦值,每一行第一個數都是0,行數和列數相等位置上的數值也為0,其余的根據Ck n+1=Ck-1 n-1+Ck n-1即arry[n][k]=arry[n-1][k-1]+arry[n-1][k]計算,最後輸出arry[n][k];

二、程序流程圖

技術分享

三、源代碼

  

import java.util.Scanner;
public class YangHuiTriangle {
       public static void main(String[] args) {
        //信1605-3 20163693 王曉丹
        System.out.println("請輸入組合數的n,k,以便計算n!/k!*(n-k)!");//提示用戶輸入
        Scanner input=new Scanner(System.in);
        int n=0,k=0;
        
        if(input.hasNextInt())//檢測輸入的是否是整數
        {
            n=input.nextInt();
        }
        else
        {
            System.out.println("您輸入的數據有誤!");
            System.exit(0);
        }
        if(input.hasNextInt())//檢測輸入的是否是整數
             k=input.nextInt();
        else
        {
            System.out.println("您輸入的數據有誤!");
            System.exit(0);
        }
        if(n<k)
        {
            System.out.println("輸入錯誤n<k!");
            System.exit(0);
        }
        int arry[][]=new int [n+1][n+1];
        for(int i=0;i<n+1;i++)
        {
            for(int j=0;j<=i;j++)
            {
                if(j<i&&j!=0&&j!=i)
                    arry[i][j]=arry[i-1][j-1]+arry[i-1][j];
                else
                    arry[i][j]=1;
            }
        }
        System.out.println(n+"!/"+k+"!*"+(n-k)+"!="+arry[n][k]);
    
    }

}

四、結果截圖

技術分享

技術分享

五、實驗總結

如果要計算Ck n就需要n+1行,建立一個n+1行n+1列的二維數組,而不是n*n的二維數組,但輸出的時候輸出的是arry[n][k],因為n代表第n+1行;

課後作業1

使用遞歸的方法用組合數遞推公式計算

一、程序設計思想

提示用戶輸入n和k的值,定義n,k,並檢測輸入的數是否是整數,檢測是否n>=k,如果不符合退出,如果都符合要求,就調用組合遞歸函數,輸出結果;組合遞歸函數,遞歸結束的條件是n=1或者k=0或者n=k,返回1,如果不是結束條件,返回zuHe(n-1,k)+zeHe(n-1,k-1),依次類推;

二、程序流程圖

技術分享

三、源代碼

  

import java.util.Scanner;
import java.math.BigInteger;
public class ZuHeShu {

    public static void main(String[] args) {
        //信1605-3 20163693 王曉丹
        System.out.println("請輸入組合數的n,k,以便計算n!/k!*(n-k)!");//提示用戶輸入
        Scanner input=new Scanner(System.in);
        int n=0,k=0;
        
        if(input.hasNextInt())//檢測輸入的是否是整數
        {
            n=input.nextInt();
        }
        else
        {
            System.out.println("您輸入的數據有誤!");
            System.exit(0);
        }
        if(input.hasNextInt())//檢測輸入的是否是整數
             k=input.nextInt();
        else
        {
            System.out.println("您輸入的數據有誤!");
            System.exit(0);
        }
        if(n<k)
        {
            System.out.println("輸入錯誤n<k!");
            System.exit(0);
        }
        System.out.println(n+"!/"+k+"!*"+(n-k)+"!="+zuHe(n,k));

    }
    public static BigInteger zuHe(int n,int k)
    {
        if(n==1||k==0||k==n)
            return BigInteger.valueOf(1);
        else
            return zuHe(n-1,k).add(zuHe(n-1,k-1));//
    }
}

四、結果截圖

技術分享

課後作業2——漢諾塔

一、 程序設計思想

如果有在A座上有n個盤子,將n個盤子借助B盤子移動到C盤子上,就先將A上的n-1個盤子借助C移動到B上, 然後將A上最下面盤子的移動到C上,然後將B上的n-1個盤子借助A,移動到C上;在這個過程中如何將A上n-1個盤子移動到B上就和將A座上的盤子移動到C上是一樣的操作,只是移動盤子的順序改變,所以可以使用遞歸,遞歸結束的條件是只剩下一個盤子,然後直接將A座上最後一個盤子移動到C座上。

二、 程序流程圖

技術分享

三、源代碼

import java.util.Scanner;
public class Hanoi {

    public static void main(String[] args) {
        // 信1605-3 20163693 王曉丹
        System.out.print("請輸入盤子的個數:");
        Scanner input=new Scanner(System.in);
        int n=0;
        if(input.hasNextInt())//檢測輸入的是否是整數
            n=input.nextInt();
        else
            System.out.println("輸入錯誤!");
        System.out.println("移動盤子的步驟是:");
        hanoi(n,‘A‘,‘B‘,‘C‘);//調用函數
  
    }
    public static void hanoi(int n,char one,char two ,char three)
    {
        //如果只有一個盤子,那麽就直接從A移動到B
        if(n==1)
            move(one,three);
        /*如果不止一個盤子,那麽就先將one上的n-1個盤子借助three移動到two上,
         然後將one上最下面的移動到three上,
         然後將two上的n-1個盤子借助one,移動到three上;*/
        else
        {
            hanoi(n-1,one,three,two);
            move(one,three);
            hanoi(n-1,two,one,three);
        }
    }
    public static void move(char x,char y)//移動函數
    {
        System.out.println(x+"->"+y);
    }

}

四、 結果截圖

技術分享

課後作業3——回文

一、 程序設計思想

定義字符串變量並輸入字符串,定義兩個整數變量存放字符串第一個字符的位置和最後一個字符的位置,調用遞歸函數判斷是否是回文,用if else輸出結果。遞歸函數中,遞歸結束的條件是第一個字符和最後一個字符相等或者第一個字符等於最後一個字符減一,如果在遞歸函數中繼續調用該函數,返回值是第一個和最後一個字符相等的真假並上第二個字符和倒數第二個字符是否相等;如和判斷除去第一個和最後一個字符的字符串是否相等,繼續調用回文遞歸函數,以此類推。

二、 程序流程圖

技術分享

三、 源代碼

import java.util.Scanner;
public class palindrome {

      public static void main(String[] args) {
        //信1605-3 20163693 王曉丹
        System.out.print("請輸入字符串:");
        Scanner input=new Scanner(System.in);
        String str=input.nextLine();
        int i=0;
        int j=str.length()-1;
        if(huiwen(str,i,j)==true)
            System.out.println("輸入的字符串是回文!");
        else
            System.out.println("輸入的字符串不是回文!");
    }
    public static boolean huiwen(String str,int i,int j)//判斷是否是回文數的函數
    {
        if(i==j||i==j-1)//遞歸結束的條件
        {
            if(str.charAt(i)==str.charAt(j))
                return true;
            else
                return false;
        }
        else
            return (str.charAt(i)==str.charAt(j))&&huiwen(str,i+1,j-1);
        //charAt()方法返回指定索引位置的字符值
    }

}

四、 結果截圖

技術分享

技術分享

技術分享

技術分享

五、 實驗總結

本題遞歸結束的條件從前向後數到的字符和從後往前數到的字符下標相等或者差1,原來直接判斷完,就return true是不正確的,還需要驗證他們的值是否相等,相等返回true,不相等返回false。

課後作業——遞歸(組合數、漢諾塔、回文)