Recursion 破译以下方法

Recursion 破译以下方法,recursion,recursive-backtracking,Recursion,Recursive Backtracking,我正在解决一个大约两年前在我的课程中给出的测试,它得到了以下方法 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); } } 现在,我

我正在解决一个大约两年前在我的课程中给出的测试,它得到了以下方法

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个数字的组合。 我也花时间使用调试器来跟踪它 但我不明白背后的逻辑是什么

我的意思是,作为一名开发人员,我该如何创建这样的递归。
这一回溯背后的逻辑是什么

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.
调试

调试器适用于查找逻辑流问题。从全局来看,有时需要收集更多的数据来作为一个整体进行调查。插入几个print语句来跟踪逻辑,并让它向您输出行

对于函数,我建议第一个语句是一个print,以显示“ENTER”、函数名(在本例中是多余的)和参数。还可以在决策点打印:也可以跟踪递归步骤

此例行程序的跟踪

下面是我跟踪问题时的输出,每个递归级别缩进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