2017-08-23 74 views
4

我在繞過遞歸時遇到了困難,更具體地說,是我的教科書中提供的語法。它看起來像這樣:遞歸調用一個方法

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

突出顯示的行相當於'result = num + this.sum(num - 1);'。 –

+0

不知道這與遞歸有什麼關係......你可以在這個語法之後調用同一個類的任何方法* –

回答

3

如果調用者在與方法相同的類中,則可以通過其名稱調用方法而沒有任何點或導入。這是因爲Java只使用點來導航到方法的類位置,但是如果方法被調用時沒有任何點,那麼程序就會知道該方法在調用者的類中。你可以使用這種方法調用所有類型的的方法,只要它們在同一個類中或超類

以區號爲例,當您在手機上撥打號碼時,您將撥打1,然後撥打3位數區號,然後撥打7號碼。但是,如果您的電話在您撥打的號碼的3位數區號內登記,則只需鍵入不帶區號的7位數字號碼。

3

當一個方法簡單地通過它的名字被調用並且不是靜態的,這意味着你正在調用this上的方法。所以,你的代碼等同於以下情況:

public int sum (int num) { 
    int result; 

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

這是一類定義的任何實例方法真實的,而不僅僅是遞歸方法(這是語法上不以任何特定的方式特殊)。

0

在Java中,你不能讓你莫名其妙地被迫把它寫一個類內部進行課外功能。現在,你有兩種類型的方法:

靜態 - 你可以把它看作'放在容器/命名空間(類是容器在這種情況下)的'自由'功能。

非靜態 - 這是一個具有被Java通過一個特殊的參數方法:self包含實例數據,例如:

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

現在,當你在裏面一個靜態的還是非靜態方法你有一個周圍類的範圍,這意味着你可以使用其他類成員,而不需要添加selfClassName