Java 学习递归,调用类时出错
我现在正在学习递归,当我在Java 学习递归,调用类时出错,java,Java,我现在正在学习递归,当我在thisclass方法中使用else语句时,在它输出异常数量的零之后,我得到了一个错误 我想让程序运行10次,然后按照打印1/3、2/5、3/7等行进行操作 哪里出了问题?您得到的是所有这些0,因为您正在进行整数除法,它不支持1/3等 您应该将代码更改为使用float,这将消除0问题 例如 您还将在每次调用时重置y的值,因此y在调用开始时总是3,在调用结束时总是5。您应该检查z的值,以查看y的值应该是多少 x的值也是如此 每次调用时都会出现z,这将导致z的值不会随着每次
thisclass
方法中使用else语句时,在它输出异常数量的零之后,我得到了一个错误
我想让程序运行10次,然后按照打印1/3、2/5、3/7等行进行操作
哪里出了问题?您得到的是所有这些
0
,因为您正在进行整数除法
,它不支持1/3
等
您应该将代码更改为使用float
,这将消除0
问题
例如
您还将在每次调用时重置y
的值,因此y
在调用开始时总是3
,在调用结束时总是5
。您应该检查z
的值,以查看y
的值应该是多少
x的值也是如此
每次调用时都会出现z
,这将导致z
的值不会随着每次调用而增加,您应该将调用更改为:
float x = 1.0;
float y = 3.0;
使其具有价值。否则这个电话将永远持续下去
另外,请不要调用您的方法thisklass
这会让人非常困惑。这一行:
thisclass(++z);
不会做你认为它会做的事。它递增“z”,然后根据z的原始值调用这个类。这很像做:
thisclass(z++);
您希望在此处使用预增量而不是后增量:
int temp = z;
z = z + 1;
thisclass(temp);
拉比特和塞尔达利斯发布的答案也是有效的。在完成所有这些更改之前,它将无法正常工作。在else条件下增加x和y不会影响递归调用变量。将递归视为对同一方法的新调用。
因此,在进行递归调用时,x和y被初始化回1和3。可以将x和y作为参数传递,这样更新后的值就可以传递给每个递归调用。是解决这个问题的一种方法
希望这有帮助:)据我所知,有三件事(命名约定除外)导致您的程序无法按预期运行
(1) 您正在打印中进行整数除法,因此1/3将是0(整数中没有小数)
解决方案:将intx
和inty
更改为double x
和double y
(2) 当您将z传递到递归调用中时,您是在后递增z,这意味着递归调用不会看到新值,而是看到旧值
解决方案:预增量zthisclass(++z)
(3) 您可能还希望在方法之外声明x
和y
,以便它们的更新值保持不变。(相反,您只需打印相同的值10次)
解决方案:
thisclass(++z);
注:
- 最好使用调用递归函数本身的初始调用函数进行初始化
- 使用
静态
数据,否则它们将不会通过递归调用被保留
recur(z++)
将像recur(z)
一样执行,导致无限重复,请改用recur(z+1)
代码:
仅供参考,“thisclass”是一个方法,而不是一个类,它非常令人困惑…@Hydryh-或使x
和y
类变量谢谢你们的回答,感觉像是一个脸谱时刻我应该知道这些事情。
thisclass(++z);
double x = 1.0;
double y = 3.0;
public static void thisclass(int z){ ...
public class recursion
{
public static void main(String[] args)
{
startRecursive(0);
}
// using static data
private static int x = 1, y = 3;
// initial call
public static void startRecursive (int initZ)
{
x = 1;
y = 3;
// avoid infinite recurrence
if (initZ > 10) initZ = 0;
recur(initZ);
}
// recursive function
public static void recur(int z)
{
if (z == 10)
{
System.out.println("Done");
}
else
{
System.out.println(x/y);
x += 1;
y += 2;
recur(z+1); // z++ will return z
}
}
}