跳轉至內容

Javagony/For 迴圈

來自華夏公益教科書,開放的書籍,面向開放的世界

如前言中所述,Javagony 不允許任何迴圈。在本節中,您將學習 Javagony 中 for 迴圈的替代方案。我們將建立一個遞迴函式,它將提供以下 for 迴圈的功能

for(int i=0;i<5;i+=1)
{
   //code
}

您可以寫 i++,但我故意寫了 i+=1,以示您可以寫 i+=2 或任何您想要的其他數字。我們將使用遞迴以及上一節的知識來模擬此迴圈的功能。

public class For
{
   public static void main(String[] args)
   {
      forFunction(0,10,1);
   }
   
   public static void forFunction(int firstNum,int lastNum,int step)
   {
      System.out.println(firstNum); //replace with the code you want to run
      
      firstNum+=step;
      
      try
      {
         int temp=Math.addExact(firstNum+1,Integer.MAX_VALUE-lastNum);
         forFunction(firstNum,lastNum,step);
      }
      catch(Exception IO) {}
   }
}

請注意,我們重複使用了上一節中比較 2 個整數以檢查哪個更大的程式碼。

此函式獲取三個值:firstNum、lastNum 和 step。在本節中,假設 step 是一個正數。我們將在本章的下一節討論 step 的負值。這段程式碼在常規的 Java 中可以寫成以下形式

for(int i=0;i<10;i++)
{
   System.out.println(i);
}

首先,該函式列印值 firstNum。這是為了表明它迭代了常規 for 迴圈會迭代的所有數字。您可以用您想要的程式碼替換它。然後,我們將 firstNum 增加 step,並使用我們在上一節中獲得的知識來檢查 firstNum 是否小於 lastNum。

請注意,我寫了 firstNum+1 而不是隻寫 firstNum。這是因為我希望 firstNum 小於 lastNum,但此方法檢查 firstNum 是否小於或等於 lastNum。如果 firstNum+1<=lastNum,那麼我們可以得出結論 firstNum<lastNum。在這段程式碼中,我們只處理整數。省略 +1 將導致以下常規 Java 程式碼的 Javagony 版本

for(int i=0;i<=10;i++)
{
   System.out.println(i);
}

如果 firstNum(此時包含下一個數字的值)小於 lastNum,那麼我們將繼續進行下一個迭代。

如果 step<0

[編輯 | 編輯原始碼]

現在,讓我們將 main 方法中傳遞給函式的值更改為 0,-10,-1,並觀察程式碼將如何工作。

   public static void main(String[] args)
   {
      forFunction(0,-10,-1)
   }

如果我們現在執行程式碼,我們將看到它列印以下輸出

0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10

但這不是我們想要的。我們不希望程式碼迭代最後一個值。讓我們檢查程式碼的執行方式,看看如何修復它。

程式碼以變數 firstValue 為 0 開始並列印它。然後它將變數增加 -1,這與從它中減去 1 相同,我們得到 -1。

現在,我們開始比較。lastNum 的值(在本例中為 -10)從 int 中可能儲存的最大值中減去。這與加 10 相同。人們可能會認為這會導致錯誤,但實際上會發生整數溢位,我們將會得到一個負數。

然後,使用不允許多次整數溢位的方法 forFunc,我們將 firstNum+1 的值(在本例中結果為 0)新增到這個大的負數中,如果不會發生整數溢位,我們將繼續進行下一個迭代。

程式碼列印 -9 後會發生什麼?好吧,它會將 firstNum 的值更改為 -10,然後檢查 -9 加上這個大的負數是否會導致整數溢位。但是,它不會,並且繼續迭代 i=-10。

如何修復它?好吧,我們可以透過省略 +1 來修復它,但如果 step>0,我們將遇到同樣的問題。我們可以有兩個函式,一個省略 +1,另一個不省略。

第一個函式將是以下迴圈的替代,如果 step=1

for(int i=0;i<=5;i++)
{
   System.out.println(i);
}

如果 step=-1

for(int i=0;i>-5;i-)
{
   System.out.println(i);
}

第二個函式將是以下迴圈的替代,如果 step=1

for(int i=0;i<5;i++)
{
   System.out.println(i);
}

如果 step=-1

for(int i=0;i>=-5;i-)
{
   System.out.println(i);
}

現在,您已經涵蓋了所有選項,您只需要弄清楚哪一個適合您在下一個生產應用程式中使用的,因為從現在開始,您將只用 Javagony 編寫程式碼。不,實際上不是這樣。

華夏公益教科書