0
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 等的方式执行一些操作。

我哪里错了?

4

5 回答 5

4

这一行:

thisclass(z++);

不做你认为它做的事。它递增“z”,然后在 z 的原始值上调用这个类。这很像:

int temp = z;
z = z + 1;
thisclass(temp);

您想在这里使用 preincrement 而不是 postincrement:

thisclass(++z);

DrinkenRabbit 和 Serdalis 发布的答案也是有效的。在您完成所有这些更改之前,它不会正常工作。

于 2013-04-10T01:48:39.717 回答
3

据我所知(除了命名约定)三件事会导致您的程序无法按预期运行。

(1) 您在打印中进行整数除法,因此 1/3 将为 0(整数中没有小数)。

解决方案:将and更改为int xand 。int ydouble xdouble y

(2) 当您将 z 传递给递归调用时,您正在增加它,这意味着递归调用看不到新值,而是看到旧值。

解决方案:预增量 z thisclass(++z)

(3) 您也可能意味着在您的方法之外拥有xy声明,以便它们的更新值持续存在。(相反,您只需打印 10 次相同的值)。

解决方案:

double x = 1.0;
double y = 3.0;
public static void thisclass(int z){ ... 
于 2013-04-10T01:53:00.030 回答
2

你得到所有这些0是因为你在做integer division,不支持1/3等等。

您应该更改代码以使用float's 来0解决问题。

例如

float x = 1.0;
float y = 3.0;

您还会在y每次调用时重置 的值,因此y将始终3在调用开始和5结束时进行。您应该检查 的值z以查看 的值y应该是多少。

的值也可以这样说x

每次通话时都会出现,这将导致每次通话时的值z不会增加,您应该将通话更改为:post-incrementedz

thisclass(++z);

使价值pre-incremented。否则这个电话将永远持续下去。

另外,请不要调用您的方法thisclass,这很混乱。

于 2013-04-10T01:47:16.767 回答
1

在 else 条件中递增 x 和 y 不会影响递归调用变量。将递归视为对同一方法的新调用。因此,在进行递归调用时,x 和 y 被初始化回 1 和 3。您可以将 x 和 y 作为参数传递,以便可以将更新后的值传递给每个递归调用。这是解决这个问题的一种方法...

希望这可以帮助 :)

于 2013-04-10T01:49:51.537 回答
0

笔记:

  • 最好使用调用递归函数本身的初始调用函数进行初始化

  • 使用static数据,否则它们将不会通过递归调用保留

  • recur(z++)将像recur(z)导致无限重复一样执行,请recur(z+1)改用

代码:

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
        }
    }
}
于 2013-04-10T03:01:31.487 回答