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,这意味着递归调用不会看到新值,而是看到旧值

解决方案:预增量z
thisclass(++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
        }
    }
}