簡體   English   中英

遞歸在這里如何工作?

[英]How does recursion work here?

遞歸對我來說是一種新的實踐,我正在嘗試做得更好,並了解方法如何返回。 我有以下程序,但對如何使用this關鍵字不滿意。 您能否查看一下代碼,並逐步引導我完成顯示方法執行時變量所包含的值的程序?

我已經嘗試了很多方法來確定執行后,compute方法中的值答案如何保持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];
    }

}

好了,我在這里注意到以下幾點:

go()的目的似乎是計算數組中數字的總和。 在這種情況下,您的方法應如下所示:

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始終引用您代碼所在的當前類實例。在這種情況下,您在主函數中創建一個名為rRecurs1實例,因此,每當對該特定對象調用方法時,這些方法中使用的this關鍵字將引用r 如果在程序中創建了多個Recurs1對象(每個Recurs1對象具有可能不同的內部狀態),則它們各自的this引用將始終指向自身,從而允許您訪問其成員變量和方法。

希望對您有所幫助,並祝您好運,通常大多數人一開始都會遇到遞歸問題,但是一旦習慣了,那就很酷了!

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

請記住,我從未嘗試使用Java類來做到這一點。

遞歸表示函數重復調用自己,直到獲得答案為止,或者函數檢測到堆棧空間不足。

您首先要進入該函數,以確定是否可以自稱。

當您自稱時,您會將數據的新副本推入堆棧並開始執行。 認為在Java的情況下,您將在堆中分配一個新對象(對此不加引號),並且每次調用都將具有一組新的變量,這些變量將填充新的值。

隨着遞歸的深入,您只需分配對象的新副本,直到找到答案或內存不足。

如果找到答案,則將結果返回到對象堆棧中的上一級,例如:

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

如您所見,如果條件測試為true,則foo()不斷被調用。 現在,在每次調用時,foo()的變量都會保存到您可以訪問的多個級別。 如果條件測試為false,則foo()的每個實例都會返回到前一個實例,直到您對foo()進行了原始調用,然后才將其返回給foo()的調用者。

像泥一樣清除?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM