从左到右尝试模型
base case : 当到达叶子节点时,打印
如果只是获得个数,每一条路地下都有两个分支
代码
public class T26_SubString {
public static void main(String[] args) {
System.out.println(process(new char[]{'a', 'b', 'c'}, 0));
char[] a = {'a', 'b', 'c'};
process2(a, 0, "");
}
public static int process(char[] chs, int index){
if(index == chs.length) return 1;
int res = 0;
res = 2 * process(chs, index +1);
return res;
}
/**如果要打印*/
public static void process2(char[] chs, int index, String str){
if(index == chs.length) {
System.out.println(str);
return;
} ;
process2(chs, index +1, str + String.valueOf(chs[index]));
process2(chs, index+1, str);
}
}
左程云的:少了一个临时存储变量String str;
利用了0字符转换成String表示空字符吧应该。
奥不是,就是当成了0;
左程云版本2:
注意:这里形式参数因为是引用,要保证子过程获得的参数是一致的,所以有copyList操作。
题目2:字符串组合问题
tips: 注意base case , 0 的处理。
一种方式是如果当前字符是0字符,就是一个无效的。
左程云的代码:
tips:
- 对于0,可以考虑在路径选择上考虑进来潜台词,也可以不考虑而在base case中排除
- 如果尝试的下标index有+2的情况,为了简化base case,在调用之前要加上判断是否来到最后一个位置。
否则,会出现重复加的情况,改起来就麻烦了,比如我的代码。
我的
public class T29_SubString_NumTransfer {
public static void main(String[] args) {
int[] arr = {1,1,1};
System.out.println(process(arr, 0));
}
/**从arr[index..]往后自由选择,一共多少种情况*/
public static int process(int[] arr , int index ){
if(index == arr.length-1) return 1;
if(index == arr.length) return 1;
int res = 0;
/**有一个浅台词当前压中的不是0*/
if(index < arr.length-1 && arr[index+1] == 0){
res = process(arr ,index +2);
}else
if(arr[index] >2 ||( index < arr.length-1 && arr[index] ==2 && arr[index+1]>6) ){
res += process(arr ,index +1);
}
else {
res += process(arr, index + 1);
res += process(arr, index + 2);
}
return res;
}
}