跳转至内容

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 编写代码。不,实际上不是这样。

华夏公益教科书