理解遞迴與迴圈

2022-10-05 06:02:49

一、遞迴與迴圈的對比

  • 遞迴會帶來大量的函數呼叫。這是不好的

  • 在計算環節特別大的前提下,遞迴就是不好的,因為遞迴是先呼叫,再計算。

    • 在大量計算的前提下可能會造成棧溢位(StackOverFlow)
    • 如下圖:

    

  • 迴圈是先計算再呼叫,計算完後會呼叫的方法會從棧中抹去,最後將結果輸出

  • 能不用遞迴就不用遞迴
  • 小計算可以考慮用遞迴,大計算就不考慮了

二、遞迴講解

1、概念

  • A方法呼叫B方法,我們很容易理解

  • 遞迴就是:A方法呼叫A方法!就是自己呼叫自己

2、遞迴的用處

  • 遞迴策略只需要少量的程式就可以描述出解題過程所需要的多次重複計算,大大減少了程式的程式碼量

  • 遞迴的能力在於用有限的語句來定義物件的無限集合

3、遞迴結構包含兩個部分

  • 遞迴頭:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈

  • 遞迴體:什麼時候需要呼叫自身方法

4、程式碼如下

         

5、遞迴的壞處

  • 遞迴會帶來大量的函數呼叫。這是不好的

  • 在計算環節特別大的前提下,遞迴就是不好的,因為遞迴是先呼叫,再計算。迴圈是先計算再呼叫

三、迴圈講解

1、while 迴圈

  • 基本結構

    1 while( 布林表示式 ){ 
    2     //迴圈結構  
    3 }
  • 只要布林表示式為true,迴圈就會一直執行下去

  • 迴圈條件一直為true就會造成無限迴圈【死迴圈】,這是在正常程式下需要避免的

  • 少部分情況下需要回圈一直執行下去。例如伺服器的請求響應監聽等

  • 1  //例子:從1加到100求和
    2  //程式碼主要部分
    3  while(i<=100){
    4     sum+=i;
    5     i++;
    6  }

2、do...while迴圈

  • 對於while'語句而言,如果不滿足條件,則不能進入迴圈,但有時候我們需要即使不滿足條件的情況下,程式也要至少執行一次

  • do.....while迴圈和while迴圈相似,不同的是:do....while迴圈至少會執行一次

  • 語法結構

    1  do{
    2      //程式碼語句
    3  }while(布林表示式);
  • while與do-while的區別

    while是先判斷後執行。do-while是先執行後判斷

    do-while總是保證迴圈體至少會被迴圈一次!這是它們的主要區別

  • 1 //例子:從1加到100求和
    2  //程式碼主要部分
    3  do{
    4    sum+=i;
    5    i++;
    6  }while(i<=100); 

3、for 迴圈

  • 雖然所有的迴圈結構都可以使用while和do....while表示,但Java提供了另一種語句:for迴圈

  • for迴圈相較與其它二者更高效,執行速度快

  • 格式如下

    1  for(初始化;布林表示式;迭代式){
    2      //程式碼語句
    3  }

4、在Java5種引入了一種主要用於陣列的增強型for迴圈

  • 主要是用來遍歷陣列集合

  • 格式如下:

     1  for(宣告語句:表示式){
     2      //程式碼語句
     3  }
     4  5  6  //例子如下:
     7  int[] numbers={1,2,3,4,5};
     8  for(int x:numbers){
     9      System.out.println("陣列中的元素為"+x)
    10  }
  • 宣告語句:宣告新的區域性變數,該變數的型別必須和陣列元素的型別匹配。

    • 其作用域限定在迴圈語句塊,其值與此時陣列元素的值相等。

  • 表示式:表示式是要存取的陣列名,或者是返回值為陣列的方法。

  • 另加:陣列的靜態與動態定義