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,那麼我們將繼續進行下一個迭代。
現在,讓我們將 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 編寫程式碼。不,實際上不是這樣。