使用递归方法编写简单的java代码来打印1 - 100。
以下是代码段
public class Test
{
public static void main(String[] a)
{
printNumber(0);
}
public static void printNumber(int i)
{
if (i < 100)
{
System.out.println(i);
i = i + 1;
printNumber(i);
}
System.out.println(i);
}
}
但代码打印
0,1,2,............ 100,100,99,................ 1
所以有人请告诉我为什么要打印100,99,98 ......... 1以及出了什么问题?
修改 我尝试了逻辑在所有组合中打印1 - 100并且对我来说效果很好,但输出应该是1 - 99(从内部条件打印),最后是100(打印最后打印),但输出是1 - 100和100 - 1。
所以请告诉我为什么在输出中打印100到1。
请不要告诉我逻辑,因为我已经得到了我期望的结果
答案 0 :(得分:2)
使用此代码可行,因为当您致电printNumber (i)
时,它会呼叫并进一步移动。在100之后,它将停止调用自身并且程序计数器返回到先前调用的函数,因此它打印100到0
public class Test
{
public static void main(String[] a)
{
printNumber(0);
}
public static void printNumber(int i)
{
if (i < 100)
{
System.out.println(i);
i = i + 1;
printNumber(i);
}return;
}
}
答案 1 :(得分:1)
只需删除第二个print
语句,如下所示:
public static void printNumber(int i)
{
if(i<=100)
{
System.out.println(i);
i = i + 1;
printNumber(i);
}
}
答案 2 :(得分:1)
递归工作正如它应该做的那样
每次调用printNumber(i);无论何时停止调用它,你都会在调用堆栈中上升,在这种情况下,当1 = 100时,它将取消堆栈并完成printNumber()内的代码,在这种情况下,代码的其余部分(在递归调用之后)是另一个打印。
自java is pass by value以来,每个堆叠的通话都有不同的值:
当我说通过值时,它意味着无论何时调用者都调用了 callee参数(即:要传递给其他函数的数据) 复制并放入正式参数(被调用者的本地参数) 接收输入的变量)。 Java进行数据通信 从一个函数到另一个函数只在传递值中 环境。
所以它用每个值(100..1)调用prinln,注意它不会执行第一个(0),因为它已经增加到1。
答案 3 :(得分:-1)
public class Test
{
public static void main(String[] a)
{
printNumber(0);
}
public static void printNumber(int i)
{
if(i<=100)
{
System.out.println(i);
i+= 1;
printNumber(i);
}
}
答案 4 :(得分:-1)
没有出错。 frist系统输出打印方法的访问值。 所以它在调用printNumber()之前打印值然后 第i个值达到101,第101个printNumber方法结束,线程返回到之前调用的方法。所以第二个系统打印出特定方法的i的值。