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