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