解读以下方法

时间:2017-02-28 15:40:01

标签: 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);
          }
      }

现在,我在我的IDE上运行它并发现它打印了所有可能的k个单元组合,其中包含n个数字。 我也花了很多时间用调试器跟着它 但我只是不明白它背后的逻辑是什么

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

1 个答案:

答案 0 :(得分: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.

<强>调试

调试器适用于查找逻辑流问题。总而言之,您有时需要收集更多数据进行调查。坚持使用几个 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