2017-02-28 44 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