我解决了大约两年前在我的课程中给出的测试,并且得到了以下方法
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个数字。 我也花了很多时间用调试器跟着它 但我只是不明白它背后的逻辑是什么
我的意思是,作为开发人员,我该如何创建这样的递归。 这个回溯背后的逻辑是什么
答案 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