2017-02-28 41 views
0

我解決了在大約2年前在給出我的課程測試,並得到了以下方法破譯以下方法

public static void what(int n,int k,String s){ 
      if(k==0) 
       System.out.println(s); 
      else if(n>0){ 
       what(n-1,k,s); 
       what(n-1,k-1,n+s); 
      } 
     } 

現在,我跑在我的IDE,並計算出它的打印k個單元與n個數字的所有可能組合。 我已經把我的時間與調試遵循它,以及 但我只是couln't明白什麼是邏輯的屁股它

我的意思是,作爲一個開發者我怎麼去創造這樣的遞歸。 最新這背後的邏輯回溯

回答

0

說明

n = range of elements 
k = population of each cell 
s = solution so far 

if the remaining population is 0 
    print the solution 
else 
    if there are still elements available, search two cases: 
     (1) Don't use **n** in the solution; recur. 
     (2) Do use **n** in the solution; 
      decrease the population by 1 and recur. 

DEBUGGING

調試器是好的查找邏輯流問題。總的來說,您有時需要收集更多數據才能進行整體調查。堅持在幾個打印語句來追蹤邏輯,並讓它在你的輸出線。

對於函數,我建議第一條語句是print以顯示「ENTER」,函數名稱(在本例中爲冗餘)和參數。還在決定點打印:跟蹤遞歸步驟。

TRACE此例程

這裏是當我跟蹤的問題的輸出,縮進2個空間爲遞歸的每個層次:

ENTER 4 3 
    RECUR without n 
    ENTER 3 3 
    RECUR without n 
     ENTER 2 3 
     RECUR without n 
     ENTER 1 3 
     RECUR without n 
      ENTER 0 3 
     RECUR using n 
      ENTER 0 2 1 
     RECUR using n 
     ENTER 1 2 2 
     RECUR without n 
      ENTER 0 2 2 
     RECUR using n 
      ENTER 0 1 12 
    RECUR using n 
     ENTER 2 2 3 
     RECUR without n 
     ENTER 1 2 3 
     RECUR without n 
      ENTER 0 2 3 
     RECUR using n 
      ENTER 0 1 13 
     RECUR using n 
     ENTER 1 1 23 
     RECUR without n 
      ENTER 0 1 23 
     RECUR using n 
      ENTER 0 0 123 
123 
    RECUR using n 
    ENTER 3 2 4 
    RECUR without n 
     ENTER 2 2 4 
     RECUR without n 
     ENTER 1 2 4 
     RECUR without n 
      ENTER 0 2 4 
     RECUR using n 
      ENTER 0 1 14 
     RECUR using n 
     ENTER 1 1 24 
     RECUR without n 
      ENTER 0 1 24 
     RECUR using n 
      ENTER 0 0 124 
124 
    RECUR using n 
     ENTER 2 1 34 
     RECUR without n 
     ENTER 1 1 34 
     RECUR without n 
      ENTER 0 1 34 
     RECUR using n 
      ENTER 0 0 134 
134 
     RECUR using n 
     ENTER 1 0 234 
234