java函數方法


1.方法重載

(1)源代碼

// MethodOverload.java

// Using overloaded methods

 

public class MethodOverload {

 

   public static void main(String[] args) {

      System.out.println("The square of integer 7 is " + square(7));

      System.out.println("\nThe square of double 7.5 is " + square(7.5));

   }

 

   public static int square(int x) {

      return x * x;

   }

 

   public static double square(double y) {

      return y * y;

   }

}

(2)程序截圖:

(3)分析結果,有什么特殊之處嗎

這個程序展示了方法的重載,方法的名字相同,但是參數不一樣,而且這兩個方法都可以調用,互不影響,只是結果不一樣。

滿足重載的條件:

(1)方法名相同;

(2)參數類型不同,參數個數不同,或者是參數類型的順序不同。

(3)還需要注意一點:

方法的返回值不作為方法重載的判斷條件,和方法的參數有關。

在我們常用的函數方法中就有重載的,系統給出的,有好多就是只有參數不同,進行重載。

2. 使用計算機計算組合數:

內容要求(1)使用組合數公式利用n!來計算(2)使用遞推的方法用楊輝三角形計算(3) 使用遞歸的方法用組合數遞推公式計算

1)源代碼

import java.util.Scanner;

 

//(1)使用組合數公式利用n!來計算(2)使用遞推的方法用楊輝三角形計算(3) 使用遞歸的方法用組合數遞推公式計算

public class suanfashu {

   public static  void main(String args[])

   {

      System.out.println("組合數:"+s1(8,5));

      long s;

      s=s2(8)/(s2(5)*s2(8-5));

      System.out.println("組合數:"+s);

   }

static long s1(int n,int k)//第一種方法,用遞推方法求組合數

{

  

   long Cnn=1,Ckk=1,Cnk=1;

   for(int i=1;i<=n;i++)

   {

      Cnn=Cnn*i;

   }

   for(int i=1;i<=k;i++)

   {

      Ckk=Ckk*i;

   }

   for(int i=1;i<=n-k;i++)

   {

      Cnk=Cnk*i;

   }

   return Cnn/(Ckk*Cnk);

}

 

static //第二種方法,遞歸

 

long s2(int n)

{

   if(n==0||n==1)return 1;

   return n*s2(n-1);

}

}

2)編譯錯誤

利用遞歸方法是必須要有終結的條件,沒有終結條件時就會報錯,在寫函數時必須要有static,不然就不能運行出來了,還有String args[]也必須要有,否則就不能找到函數main函數了,不能運行。

3)結論

遞歸就是“自己調用自己”,特點有他的遞歸是先從大到小,再從小到大;

每個步驟要干的事情都是類似的,只不過其規模“小一號”;必須要保持遞歸調用的過程可以終結,每個遞歸函數一定有一個控制遞歸可以終結的變量;

遞推”是“從前到后”,先求第1項,然后,在此基礎上求第2項,第3項,直至第n項,通常可以直接使用循環語句實現。

4)截圖

5)設計思想

組合數求值,用到了遞歸和遞推,用兩個方法,分別表示這兩種方法,之后在主方法中調用這兩種方法,輸出結果。

3.

(1)源代碼

import java.math.BigInteger;

import java.util.Scanner;

public class CalculateN {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

      System.out.print("請輸入N:");

      Scanner scanner=new Scanner(System.in);

      int number=scanner.nextInt();

      System.out.println(number+"!="+calculateN2(number));

     

   }

  

   public static long calculateN(int n) {

      if(n==1 || n==0){

         return 1;

      }

     

      return n*calculateN(n-1);

   }

 

   public static BigInteger calculateN2(int n) {

      if(n==1 || n==0){

         return BigInteger.valueOf(1);

      }

      return BigInteger.valueOf(n).multiply(calculateN2((n-1)));

   }

}

(2)程序結果截圖

(3)結果分析

結果是負數,本來應該是整數的,但是由於階乘后結果太大,超出范圍,所以就會出現亂碼,可以用到大數來表示,這樣就不會出現溢出的情況了。

public static BigInteger calculateN2(int n) {

      if(n==1 || n==0){

         return BigInteger.valueOf(1);

      }

      return BigInteger.valueOf(n).multiply(calculateN2((n-1)));

   }

改后的截圖:

 

不會有溢出了。

4.漢諾塔問題

(1)源程序

package demo;

//用遞歸方式編程解決漢諾塔問題。

//陳曉陽 2016.10.19

public class TowersOfHanoi

{

   //遞歸的移動塔上的盤子

   public static void solveTowers( int disks, int sourcePeg,

      int destinationPeg, int tempPeg )

   {

      // base case -- only one disk to move

      if ( disks == 1 )//只剩一個盤子就退出

      {

         System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg );

         return;//return空,去掉后就會出錯

      }

      //將disks-1個盤子借用目標塔從起始塔移動到中間塔

      solveTowers( disks - 1, sourcePeg, tempPeg, destinationPeg );

      //destinationPeg是最終的塔;sourcePeg表示起始塔, tempPeg表示中間塔

      // 輸出結果,從開始點->終點

      System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg );

 

      // 移動中間塔上的disks-1個到目標塔

      solveTowers( disks - 1, tempPeg, destinationPeg, sourcePeg );

   }

   public static void main( String[] args )

   {

      int startPeg = 1; // 開始位置設為1

      int endPeg = 3; //目標塔設為3

      int tempPeg = 2; // 中間塔設為2

      int totalDisks = 3; // 盤子的個數

     

      // 調用遞歸方法

      solveTowers( totalDisks, startPeg, endPeg, tempPeg );

   } // end main

} // end class TowersOfHanoi

(2)設計思想

首先將起始塔上的n-1個盤子移到中間塔上,借助目標塔;然后再將第n個移到目標塔上,中間塔上的n-1個盤子移到目標塔上,借助起始塔。移動借助一個方法,將方法寫成遞歸函數,遞歸調用。

(3)結果截圖

(4)編譯結果分析:

首先一定要分析清楚是怎樣移動的,將這些步驟寫成函數,遞歸調用;每一次移動一定要輸出。理解起來容易,但是程序寫起來確實不太好寫,理解程序有一些難。

5.回文數

(1)源程序

package demo;

 

import javax.swing.JOptionPane;

 

public class Number {

   public static void main(String args[])

   {

      int number=0,d5,d4,d3,d2,d1;

      String str=JOptionPane.showInputDialog("輸入一個1到99999之間的數");

      number=Integer.parseInt(str);//取所輸入的數

      if(number>=1&&number<=99999)//判斷number是否在1-99999之間

      {

         d5=number/10000;//表示萬位

         d4=number%10000/1000;//表示千位

         d3=number%1000/100;//表示百位

         d2=number%100/10;//表示十位

         d1=number%10;//表示個位

         if(d5>0)//判斷是否是5位數,是的話就是否為回文數

         {

            System.out.println(number+"是5位數");

            if(d5==d1&&d4==d2)

            {

                System.out.println(number+"是回文數");

            }

            else

            {

                System.out.println(number+"不是回文數");

            }

         }

         else if(d4>0)//判斷是否是四位數,如果是四位數就判斷是否為回文數;否則就判斷是否為三位數

         {

            System.out.println(number+"是4位數。");

            if(d4==d1&&d3==d2)

            {

                System.out.println(number+"是回文數");

            }

            else

            {

                System.out.println(number+"不是回文數");

            }

         }

         else if(d3>0)//判斷是否是三位數,是三位數就判斷是否是回文數,不是三位數就判斷是否是兩位數

         {

            System.out.println(number+"是3位數");

            if(d3==d1)

            {

                System.out.println(number+"是回文數");

            }

            else

            {

                System.out.println(number+"不是回文數");

            }

         }

         else if(d2>0)//判斷是否是兩位數,是的話就判斷是否是回文數,不是就判斷是否是一位數

         {

            System.out.println(number+"是2位數");

            if(d2==d1)

            {

                System.out.println(number+"是回文數");

            }

            else

            {

                System.out.println(number+"不是回文數");

            }

         }

         else if(d1!=0)

         {

            System.out.println(number+"是1位數");

            System.out.println(number+"是回文數");

         }

      }

      else

      {

         System.out.println(number+"不在1-99999之間");

      }

   }

}

(2)設計思想

輸入一個數,判斷是不是在1-99999之間,分別得到輸入的數的各位上的數字,判斷是幾位數,接着判斷是不是回文數,輸出判斷后的結果,要注意偶數位數和奇數位數不一樣,偶數比較的是前一半和后一半,奇數比較的是前一半和后一半,中間剩下一個,不用比較。當是一位數時直接輸出是回文數。

(3)結果截圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM