image.png
从左到右尝试模型
base case : 当到达叶子节点时,打印
如果只是获得个数,每一条路地下都有两个分支
image.png
代码

  1. public class T26_SubString {
  2. public static void main(String[] args) {
  3. System.out.println(process(new char[]{'a', 'b', 'c'}, 0));
  4. char[] a = {'a', 'b', 'c'};
  5. process2(a, 0, "");
  6. }
  7. public static int process(char[] chs, int index){
  8. if(index == chs.length) return 1;
  9. int res = 0;
  10. res = 2 * process(chs, index +1);
  11. return res;
  12. }
  13. /**如果要打印*/
  14. public static void process2(char[] chs, int index, String str){
  15. if(index == chs.length) {
  16. System.out.println(str);
  17. return;
  18. } ;
  19. process2(chs, index +1, str + String.valueOf(chs[index]));
  20. process2(chs, index+1, str);
  21. }
  22. }

左程云的:少了一个临时存储变量String str;
利用了0字符转换成String表示空字符吧应该。
奥不是,就是当成了0;
image.png
左程云版本2:
注意:这里形式参数因为是引用,要保证子过程获得的参数是一致的,所以有copyList操作。
image.png

题目2:字符串组合问题

image.png
tips: 注意base case , 0 的处理。
一种方式是如果当前字符是0字符,就是一个无效的。
image.png
左程云的代码:
tips:

  • 对于0,可以考虑在路径选择上考虑进来潜台词,也可以不考虑而在base case中排除
  • 如果尝试的下标index有+2的情况,为了简化base case,在调用之前要加上判断是否来到最后一个位置。

否则,会出现重复加的情况,改起来就麻烦了,比如我的代码。
image.png
我的

  1. public class T29_SubString_NumTransfer {
  2. public static void main(String[] args) {
  3. int[] arr = {1,1,1};
  4. System.out.println(process(arr, 0));
  5. }
  6. /**从arr[index..]往后自由选择,一共多少种情况*/
  7. public static int process(int[] arr , int index ){
  8. if(index == arr.length-1) return 1;
  9. if(index == arr.length) return 1;
  10. int res = 0;
  11. /**有一个浅台词当前压中的不是0*/
  12. if(index < arr.length-1 && arr[index+1] == 0){
  13. res = process(arr ,index +2);
  14. }else
  15. if(arr[index] >2 ||( index < arr.length-1 && arr[index] ==2 && arr[index+1]>6) ){
  16. res += process(arr ,index +1);
  17. }
  18. else {
  19. res += process(arr, index + 1);
  20. res += process(arr, index + 2);
  21. }
  22. return res;
  23. }
  24. }