public class recursion {
public static void main(String[] args)
{
thisclass(0);
}
public static void thisclass(int z)
{
int x = 1;
int y = 3;
if (z==10)
{
System.out.println("Done");
}
else
{
System.out.println(x/y);
x++;
y= y+2;
thisclass(z++);
}
}
}
我正在学习递归,当我到达thisclass
方法中的else语句时,在打印出异常数量的零后出现错误。
我想要程序做的是运行10次并按照Print 1/3 2/5 3/7等的方式执行操作。
我哪里出错了?
答案 0 :(得分:4)
这一行:
thisclass(z++);
不按照您的想法行事。它递增'z'然后在z的原始值上调用thisclass。这很像做:
int temp = z;
z = z + 1;
thisclass(temp);
你想在这里使用preincrement而不是postincrement:
thisclass(++z);
drunkenRabbit和Serdalis发布的答案也是有效的。在完成所有这些更改之前,它将无法正常工作。
答案 1 :(得分:3)
据我所知(除命名约定外)有三件事情导致程序无法正常运行。
(1)您在打印中进行整数除法,因此1/3将为0(整数中没有小数)。
解决方案:将int x
和int y
更改为double x
和double y
。
(2)当你将它传递给递归调用时,你正在递增z,这意味着递归调用看不到新值,而是旧值。
解决方案:预先增加z thisclass(++z)
。
(3)您也可能意味着在您的方法之外声明x
和y
,以便更新的值保持不变。 (相反,你只需要打印10次相同的值)。
解决方案:
double x = 1.0;
double y = 3.0;
public static void thisclass(int z){ ...
答案 2 :(得分:2)
你得到的所有0
因为你正在integer division
,而不支持1/3
等。
您应该更改代码以使用float
来消除0
问题。
E.g。
float x = 1.0;
float y = 3.0;
您还要在每次通话时重置y
的值,因此y
在通话开始时始终为3
,在结束时始终为5
。您应该检查z
的值,看看y
应该是什么价值。
同样可以说x
的价值。
每次通话时z
都为post-incremented
,这会导致z
的值不随每次通话而增加,您应将通话更改为:
thisclass(++z);
制作价值pre-incremented
。否则这个电话将永远持续下去。
另外,请不要调用您的方法thisclass
这是非常令人困惑的。
答案 3 :(得分:1)
在else条件下递增x和y不会影响递归调用变量。将递归视为对同一方法的新调用。 因此,在进行递归调用时,x和y被初始化为1和3.您可以将x和y作为参数传递,以便更新的值可以传递给每个递归调用。有一种方法可以解决这个问题......
希望这会有所帮助:)
答案 4 :(得分:0)
注意:
最好使用调用递归函数本身的初始调用函数进行初始化
使用static
数据,否则不会通过递归调用保留它们
recur(z++)
将执行recur(z)
,导致无限重复,请改用<{1}}
代码:
recur(z+1)