2012-11-20 101 views
-8

我在Java類的介紹中學習遞歸,並且我很難理解給定示例中的方法如何工作。當該方法被調用時發生了什麼?瞭解這種遞歸方法

下面是代碼:

public class Hanoi 

    private int n; 
    private int pegA; 
    private int pegB; 

    public Hanoi(int in_n, int in_pegA, int in_pegB) 
    { 
     n = in_n; 
     pegA = in_pegA; 
     pegB = in_pegB; 
    } 

    public void makemoves() 
    { 
     if (n==1) 
      System.out.format("%d ==> %d%n", pegA, pegB) 
     else 
     { 
      int otherPeg = 6 - pegA - pegB; // 1 + 2 + 3 =6 
      Hanoi firstmove = new Hanoi (n-1, pegA, otherPeg); 
      firstmove.makemoves(); 
      System.out.format("%d ==> %d%n", pegA, pegB); 
      Hanoi secondmove = new Hanoi (n-1, otherPeg, pegB); 
      secondmove.makemoves(); 
     } 
    } 
} 
+7

你面臨什麼問題明白嗎?你是否試圖追蹤該代碼? –

+2

您必須提出具體的問題 –

+0

跟蹤代碼是什麼意思?我無法理解,一行一行地發生了什麼。 因此,當firstmove.makemoves被調用時,是否立即通過創建一個新的Hanoi firstmove實例來重新開始? 還是繼續到System.out.format,然後河內secondmove,然後secondmove.makemoves(),在重新開始之前? –

回答

0

這項工作是如何僅僅通過順序遍歷二叉樹。檢查wiki

1

遞歸是一種簡單的方法調用自己,並測試休息條件。 這是一個非常簡單的例子來說明基本概念:

static void recurse(int val) { 
    if (val == 0) { 
     return; // returns from last invocation 
    } 
    System.out.println("val=" + val); 
    recurse(val - 1); 
    return; // here the method returns to previous invocation (or initial call from main) 
} 


public static void main(String[] args) { 
    recurse(3); 
} 

第一調用遞歸(3)調用方法, 測試一個3 = 0的方法調用本身與VAL後 - 1,直到該值!變爲0

調用層次結構是這樣的:

recurse(3) 
    recurse(2) 
    recurse(1) 
     recurse(0) // break condition 
     return  // val == 0 
    return   // val == 1 
    return   // val == 2 
return    // val == 3