[轉載]遞迴函式之JAVA演繹

來源:互聯網
上載者:User

                                                         遞迴函式之JAVA演繹

                                                                          lxgljj


 

1、遞迴函式的定義:

答:遞迴函式即自調用函數,在函數體內直接或間接的調用自己,即函數的嵌套是函數本身。

2、遞迴方式:遞迴調用有直接遞迴和間接遞迴兩種方式。

A:直接遞迴:在函數中出現調用函數本身。

樣本1:下面代碼求斐波那契數列第n項,斐波那契數列第一和第二項是1,後面每一項是前兩項之和,即1、1、2、3、5、8、13 ...。

程式碼:

public class Test {

  public static void main(String args[]) {

    int x1 = 1;

    int sum = 0;

    int n = 7;

 

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

      x1 = func(i);

      sum = sum + x1;

    }

    System.out.println("sum=" + sum);

  }

 

  public static int func(int x) {

    if (x > 2)

      return (func(x - 1) + func(x - 2));

    else

      return 1;

  }

}

 

B:間接遞迴:指函數中調用了其他函數,而該其他函數有調用了本函數。

樣本2:用間接遞迴來計算上述斐波那契數列。

程式碼:

public class Test {

  public static void main(String args[]) {

    int x1 = 1;

    int sum = 0;

    int n = 7;

 

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

      x1 = func1(i);

      sum = sum + x1;

    }

    System.out.println("sum=" + sum);

  }

  public static int func1(int a){

      int b;

      b=func2(a);

          return b;

  }

 

  public static int func2(int b) {

    if (b> 2)

      return (func1(b - 1) + func1(b - 2));

    else

      return 1;

  }

}

3、為什麼要用遞迴函式?遞迴函式的缺點是什嗎?

答:遞迴的目的是簡化程式設計,使程式易讀。

樣本3:下面不用遞迴函式繼續來計算上述斐波那契數列。

程式碼:

public class Test {

  public static void main(String args[]) {

    int n=7;

    int a=1, b=1, temp;

    int sum=2;

 

    for(int i=3; i<=n; i++){

      temp=a+b; a=b; b=temp;

          sum=sum+temp;

    }

    System.out.println("sum=" + sum);   

  }

}

從上面例子我們可以發現雖然非遞迴函式效率高,但較難編程,可讀性較差。遞迴函式的缺點是增加了系統開銷,也就是說,每遞迴一次,棧記憶體就多佔用一截。

 

4、遞迴的條件:

答:需有完成任務的語句,需滿足遞迴的要求(減小而不是發散)。

5、遞迴進階:

樣本4:

編程求解:若一頭小母牛,從出生起第四個年頭開始每年生一頭母牛,按次規律,第n年時有多少頭母牛?

 

程式碼:

public class Test3 {

  public static void main(String args[]) {

    int n=10;  //要查看的年數

    System.out.println("共有"+cattle(n)+"頭小母牛!");

  }

  public static int cattle(int n){

    if(n<=0)

      return 0;

    if(n<=3)

      return 1;

    return cattle(n-1)+ cattle(n-3);//此處是遞迴要好好理解。   

  }

}

 

規律:此類問題的遞迴函式為:

如果要求的是從出生起第四個年頭,則遞迴函式為cattle(n-1)+ cattle(n-3),

如果要求的是從出生起第五個年頭,則遞迴函式為cattle(n-1)+ cattle(n-4),

。。。。

依次類推。

(原代碼全部在JBuilderX下調試通過)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.