递归调用方法

时间:2017-08-23 01:28:18

标签: java recursion methods

我无法绕过递归,更具体地说是我的教科书中提供的语法。它看起来像这样:

public int sum (int num)
{
    int result;

    if (num == 1)
        result =1;
    else
        result = num +sum(num -1);
    return result;
}

我特别对这一行感到困惑:

result = num + sum(num - 1);

每次在任何其他程序中,我不断绊倒的部分,我们从两种方式之一调用方法。方法是静态方法,并通过类名称后跟句点调用,后跟方法名称。 (例如:Math.random();) 或者,该方法已通过对象引用变量调用,该变量属于同一类。 (我们首先必须独立创建) 这个语法似乎没有遵循前面两个例子中的任何一个,我想知道为什么会这样?是因为我们从方法本身调用方法,从语法上讲它是如何完成的,还是我错过了什么?

3 个答案:

答案 0 :(得分:3)

一个方法可以通过它的名称调用,没有任何点或导入如果调用者与方法在同一个类中。这是因为Java只使用点来导航到方法的类位置,但是如果调用该方法没有任何点,则程序将知道该方法在调用者的类中。您可以使用此方法调用所有类型的方法,只要它们位于同一个类或超类中。

以区号为例。当您拨打电话号码时,您将拨1,然后拨3位区号,然后拨7位号码。但是,如果您的手机在您拨打的号码的3位数区号内注册,则只需输入没有区号的7位数字。

答案 1 :(得分:3)

当一个方法只是通过名称调用而不是静态时,暗示你在this上调用该方法。因此,您的代码等同于以下内容:

public int sum (int num) {
    int result;

    if (num == 1)
        result =1;
    else
        result = num + this.sum(num -1);
    return result;
}

对于为类定义的任何实例方法都是如此,而不仅仅是递归方法(在任何特定方式下,它们在语法上都不特殊)。

答案 2 :(得分:0)

在Java中,您不能将函数放在类之外,因此您不知何故强制将其写入类中。现在,您有两种方法:

静态 - 您可以将其视为放置在容器/命名空间内的“免费”函数(在这种情况下,类是容器)。

非静态 - 这是具有Java传递的特殊参数的方法:self,其中包含实例数据,例如:

Foo a = new Foo();
a.bar();  // calls method bar from class Foo with a instance

现在,当您在静态或非静态方法中时,您具有周围类的范围,这意味着您可以使用其他类成员而无需添加selfClassName