理解遞歸與循環

  • 2022 年 10 月 4 日
  • 筆記

一、遞歸與循環的對比

  • 遞歸會帶來大量的函數調用。這是不好的

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

    • 在大量計算的前提下可能會造成棧溢出(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  }
  • 聲明語句:聲明新的局部變量,該變量的類型必須和數組元素的類型匹配。

    • 其作用域限定在循環語句塊,其值與此時數組元素的值相等。

  • 表達式:表達式是要訪問的數組名,或者是返回值為數組的方法。

  • 另加:數組的靜態與動態定義