学习递归,调用类时出错

时间:2013-04-10 01:44:39

标签: java

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

我哪里出错了?

5 个答案:

答案 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 xint y更改为double xdouble y

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

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

(3)您也可能意味着在您的方法之外声明xy,以便更新的值保持不变。 (相反,你只需要打印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)