2011-11-07 86 views
0

遞歸對我來說是一種新的練習,我試圖更好地理解它,並理解這些方法如何返回。我有以下程序,但不熟悉如何使用this關鍵字。您可以查看代碼並通過程序演示方法執行時顯示變量的值嗎?遞歸在這裏如何工作?

我已經嘗試了很多事情來確定計算方法中的值答案在執行後如何保持14,任何人都可以通過前幾個遞歸調用來引導我,因此我可以嘗試找出其餘的部分?

public class Recurs1 { 
    public static void main (String [] arg) { 
     Recurs1 r = new Recurs1(); 
     r.compute(); 

    } 
    public void compute() { 
     int [] stuff = {1, 2, 3, 4}; 
     int answer = this.go(stuff, 0); 
     System.out.println("The answer is " + answer); 

    } 
    private int go(int[] numbers, int spot) { 
     if (numbers.length == spot) return spot; 
     int value = this.go(numbers, spot + 1); 
     return value + numbers[spot]; 
    } 

} 
+4

你爲什麼不先嚐試一下,讓我們知道你是怎麼做的?特別是,如果你掙扎或不理解你得到的結果,你可以問一個具體的問題。 –

+0

聽起來像是開始學習如何使用調試器的最佳時機。否則,這只是作業的味道。 –

+1

另外,在這種情況下使用'this'有什麼困惑?您可以在這裏省略關鍵字,它在功能和語義上都是等效的。 –

回答

0

確定這樣的幾件事情,我注意到這裏:

去的()的目的似乎是計算陣列中的數字之和。如果是這樣的話,你的方法應該是這樣的:

private int go(int[] numbers, int spot) { 
     if (numbers.length - 1 == spot) return numbers[spot]; 
     int value = this.go(numbers, spot + 1); 
     return value + numbers[spot]; 
    } 

這是因爲numbers.length在這種情況下將返回4,但此數組中的最後一個元素的索引爲3(陣列0索引)。

這樣,當第二個參數設置爲3調用函數時,它將返回數組中最後一個元素的值,然後代碼將「冒泡」(我喜歡稱它)和通過隨後返回當前總和值+當前呼叫的值來計算元素的總和。

至於你的問題與this關鍵字,它其實很簡單。 this總是指您的代碼所在的當前類實例。在這種情況下,您在主函數中創建了一個名爲r的實例,因此無論何時調用該特定對象的方法,這些方法中使用的this關鍵字都將引用r 。如果您在程序中創建了多個Recurs1對象(每個對象都有可能不同的內部狀態),則它們各自的引用將始終指向它們自己,以允許您訪問其成員變量和方法。

希望幫助和祝你好運,遞歸通常是大多數人在開始時都會遇到困難的問題,但是一旦你習慣了它,它就非常酷!

0

好,所以這不是你的問題本身的答案,更像是遞歸課程。

請記住,我從來沒有試圖用java類來做到這一點。

遞歸意味着一個函數,它會重複調用自己,直到已達到答案,或者您的函數檢測到您將用完堆棧空間。

你第一步進入功能決定你是否會自己調用。

當您自己調用時,您會將新的數據副本推送到堆棧並開始執行。我認爲在Java的情況下,你會分配一個新的對象到(不要引用我這個),每個調用將有一個新的變量集合填充新的值。

隨着你越來越深入地分配對象的新副本,直到找到答案或內存不足。

如果你找到答案,你那麼結果返回到以前的水平,物品堆例如:

int foo(int i){ 
    if(some condition){ 
    return foo(i); 
    } else 
    return i 
} 

正如你可以看到,如果條件測試真把foo()狀態越來越調用。現在,在每次調用時,foo()的變量都將隨着您的需要進行深度保存。如果條件測試爲false,則foo()的每個實例都將返回到前一個,直到您最初調用foo(),然後返回給foo()的調用者。

清除泥漿?