2013-11-01 116 views
0

有人可以幫助我理解這個解決方案嗎?通過幫助,我的意思是幫助我遍歷所有事情,以至於有人像我能理解的那樣愚蠢。非常感謝你:(Java遞歸瞭解

  public void recurse(int n, char one, char two, char three) 
     { 
       if(n == 1) 
       System.out.println(n + " " + one + " " + two); 
       else 
       { 
        recurse(n - 1, one, three, two); 
        System.out.println(n + " " + one + " " + two); 
       } 
      } 

函數調用:

  recurse (4, 'A', 'B', 'C'); 
+0

那麼哪部分是不明確的? – user2864740

+0

該解決方案是, 1 AC 2 AB 3 AC 4 AB 我的問題是當伊特拉婷通過煙囪, 1 ACB 1 ABC 2 ACB N一個二三 我不明白爲什麼b和c不斷來回切換 – user201535

+1

查看方法定義中參數的順序,然後查看方法調用中參數的順序。 (確保包括那種在後/問題的信息/問題)。 – user2864740

回答

1

this.recurse (4, 'A', 'B', 'C');

第一輪: n不是== 1 - >recurse(3, 'A', 'C', 'B');

第二輪: n不是== 1 - >recurse(2, 'A', 'B', 'C');

第3輪: n不是== 1 - >recurse(1, 'A', 'C', 'B');

第4輪: ñ== 1 - >控制檯打印: 「1 AC」

即將備份的遞歸鏈:

控制檯打印: 「2 AB」

控制檯打印: 「3 AC」

控制檯打印: 「4 AB」

01在控制檯

最後的結果將是

1 A C 
2 A B 
3 A C 
4 A B 
+0

其實,你可以走我通過遞歸(3,「A」,「B」,「C」)的真快,如果它是不是很麻煩? – user201535

+0

這是一個非常類似的程序,雖然相反,輸出將是1AB2AC3AB。基本上,如果你從一個奇數開始,模式會一直持續到1,然後以AB結束,如果你以一個偶數開始,模式會一直持續到1 h將以AC結束。特別是有一部分代碼讓你困惑? – Wold

+0

噢,好吧,我想我這次肯定會得到它。只是雙重檢查,讓我感到困惑的部分是首先發生的事情。在我們開始遞歸之前,3將只是A B C,然後當n = 2時,我們會遞歸地切換三個和兩個?如果是這樣的話,那麼我明白了:D – user201535

1

,每天調用方法時,從該行的遞歸時間開關 - 多少次是遞歸調用?請記住,每次調用方法時,參數都不同於其他任何調用。 - user201535

該用戶對我來說很清楚,再次感謝您。

0

首先您需要了解什麼是遞歸。

遞歸意味着一次又一次地調用自己的方法,所以現在你會想知道函數會一直調用自己,所以當它停止時呢? 這裏談到的基本條件

即在你的代碼是,如果(N == 1)

當n == 1的功能將停止自稱和打印結果。

調用該函數具有值

所以第一呼叫將是遞歸(4, 'A', 'B', 'C');

將進入功能和看到n是否== 1這是在第一次迭代。

它將再次調用該函數與n-1個這將是

它將繼續調用這樣的函數,直到第n變得等於1

,然後它會打印1 AB

希望你現在得到它。

+0

確實,謝謝你的解釋。 – user201535

+0

其實,如果不是太麻煩,你能否真正快速地通過遞歸(3,'A','B','C')來引導我? – user201535

+0

你想知道遞歸後會發生什麼(3,'A','B','C')? –

0

首先,它會到最後一行 遞歸(4,'A','B','C'); 這是名爲'recurse'調用的函數,它傳遞參數,對應於(int n,char one,char two,char three);

現在當函數被調用並傳入參數 它檢查(n == 1)的值,如果這個條件有效,它將寫入'n','one','2 '通過這個聲明 System.out.println(n +「」+ one +「」+ two);

然後,如果這(N == 1)條件是無效的,它跳轉到其他 { 遞歸 (N - 1,一,三,二); System.out.println(n +「」+ one +「」+ two); } 現在這裏是遞歸發生的地方,意味着一個函數'recurse'在自己的主體中一次又一次地調用自己。

現在當它進入else的身體 - 它會的,所以它會調用遞歸(n - 1,一,三,二);並且函數遞歸會再次執行,直到n = 1,即第4次迭代時纔會執行。並且功能完成。

1

立即從另一個函數調用一個函數的想法表明了函數自己調用的可能性。 Java中的函數調用機制支持這種可能性,這就是所謂的遞歸。遞歸是一種功能強大的通用編程技術,是許多重要計算應用程序的關鍵,從爲信息處理(第4章)提供基本支持的組合搜索和排序方法方法到信號處理的快速傅里葉變換(第9)。

您的第一個遞歸程序。 遞歸的HelloWorld的是落實階乘函數,這是由方程

N! = N × (N-1) × (N-2) × ... × 2 × 1 

N代表正整數N,定義!很容易計算與一個for循環,但在Factorial.java一個更簡單的方法是使用下面的遞歸函數:

public static int factorial(int N) { 
    if (N == 1) return 1; 
    return N * factorial(N-1); 
} 

,它通過注意因子生成所需的結果你能說服自己()返回1 = 1!當n爲1,並且如果正確計算值

(N-1)! = (N-1) × (N-2) × ... × 2 × 1 

那麼正確計算值

N! = N × (N-1)! = N × (N-1) × (N-2) × ... × 2 × 1 

我們可以跟蹤我們跟蹤的函數調用任何序列以同樣的方式這種計算。

factorial(5) 
    factorial(4) 
     factorial(3) 
     factorial(2) 
      factorial(1) 
       return 1 
      return 2*1 = 2 
     return 3*2 = 6 
     return 4*6 = 24 
    return 5*24 = 120 

我們的階乘()實現展現了每個遞歸函數所需的兩個主要組件。

The base case returns a value without making any subsequent recursive calls. It does this for one or more special input values for which the function can be evaluated without recursion. For factorial(), the base case is N = 1. 

The reduction step is the central part of a recursive function. It relates the function at one (or more) inputs to the function evaluated at one (or more) other inputs. Furthermore, the sequence of parameter values must converge to the base case. For factorial(), the reduction step is N * factorial(N-1) and N decreases by one for each call, so the sequence of parameter values converges to the base case of N = 1. 


Now in your case (n==1) is the base condition or terminating condition. 
recurse(4,'A','B','C') 
    recurse(3,'A','C','B') 
    recurse(2,'A','B','C') 
     recurse(1,'A','C','B') 

     return : 1 A C 
    return : 2 A B 
    return : 3 A C 
return : 4 A B 

final output : 
1 A C 
2 A B 
3 A C 
4 A B