暴力递归2
1.
* 将一个字符串转换为字母的形式,转换规则如下:
* 对一个字符串:123,可以将其看成三个部分转为1--A,2--B,3--C,也可转为12--L,3--C
* 即既可以转为ABC,也可以转为LC
*
* 现求该字符串有多少种转换形式
代码及解析:
1 //该函数表示str在0——i - 1位置都确定时,可以进行的向下递归情况 2 public static int process(char[] str,int i) { 3 if (i == str.length) {//转移到最后一个说明形成了一种可行的转换情况 4 return 1; 5 } 6 if (str[i] == '0') {//单独的一个0开头无法转换,说明之前的转法有错误,所以该路径可能的情况为0种 7 return 0; 8 } 9 if (str[i] == '1') { 10 int ans = process(str,i + 1);//直接将str[i]转为A,再向后续进行转换 11 if (i + 1 < str.length) { 12 ans += process(str, i + 2);//将str[i]和str[i+1]作为整体转为一个字符,再向后续进行转换 13 } 14 return ans; 15 } 16 if (str[i] == '2') {//思路与str[i] == '1'类似 17 int ans = process(str,i + 1); 18 if (i + 1 < str.length && str[i + 1] >= '0' && str[i + 1] <= '6') { 19 ans += process(str,i + 2); 20 } 21 return ans; 22 } 23 //str[i] == '3' —— '9'的情况(只能把一个作为整体来转) 24 return process(str,i + 1); 25 }
2.
* 背包问题的暴力递归解法
*
* 即通过递归去尝试是否取每一种物品,去遍历所有情况后找到最优解法
代码及解析:
1 //[]weights,[]values为每件商品的重量和价值,i表示目前选到第i个背包,alreadyweight为目前已承载的重量 2 //bag为最大可承受的重量 3 public static int process(int[] weights,int [] values,int i,int alreadyweight,int bag) { 4 if (alreadyweight > bag) { 5 return 0; 6 } 7 if (i == weights.length) {//没有东西可取了 8 return 0; 9 } 10 //分取和不取两种情况讨论 11 return Math.max(process(weights,values,i + 1,alreadyweight,bag), 12 values[i] + process(weights,values,i + 1,alreadyweight + weights[i],bag)); 13 }