如何调试递归程序,有何技巧?
2023-04-18 14:24:59 时间
前言
我是在用idea调试java的二路归并的? [200]岛屿数量 Medium 2023-03-08 191的时候被单步调试弄得快要疯了才来搜索这个问题的,然后看到回答里面说打印,我真的想捶我自己(别笑QAQ,我只是一时没想到)。
1 递归代码
下面是我要调试的递归的代码:
//输入:grid = [
// ["1","1","1","1","0"],
// ["1","1","0","1","0"],
// ["1","1","0","0","0"],
// ["0","0","0","0","0"]
//]
public void low(int l , int r,Character[][] grid){
grid[l][r] = '0' ;
int length = grid[l].length;
int len = grid.length;
/*右*/
while( r+1 < length && grid[l][r+1] == '1' ){
low(l , ++r,grid);
}
/*左*/
while(0< r-1 && grid[l][r-1] == '1' ){
low(l , r--,grid);
// grid[l][r-1] = '0';
// r--;
}
/*上*/
while(0<l-1 && grid[l-1][r] == '1' ){
low(l-- , r,grid);
// grid[l-1][r] = '0';
// l--;
}
/*下*/
while(l+1 < len && grid[l+1][r] == '1' ){
low(++l , r,grid);
// grid[l+1][r] = '0';
// l++;
}
}
}
2 函数头下面输出
首先我在函数头下面输出调用信息:
System.out.println("调用了low函数 | 参数 l r grid"+l+r+grid);
我还想知道每一个调用函数是第几层,如果这一大坨输出有缩进会不会更好一点呢?缩进简单,输出制表符“ ”就好。但是输出几个呢?
所以需要用一个计数的变量来计算目前递归的层数,进而产生缩进效果。有两个方法,一个方法是我敲这些字的时候想到的,全局变量,在函数头自增1,在函数尾自减1,就可以知道当前递归层数。
我用的是静态变量。对于一个函数里面的静态变量来说,使用static关键字声明并初始化它之后,这条声明语句会在下一次执行时忽略,并且这个静态变量会一直活到程序结束,不像其他函数中声明的局部变量一样命短。其实这也相当于是一种全局变量,只不过是在调用这个函数的时候才创建出来。其他和第一种方法一样,在函数头自增1,在函数尾自减1。
然后在想要缩进的地方前面加上:
提交代码
String lev = "";
for (Integer i = 0; i < leve; i++) {
lev += " ";
}
System.out.println(lev+"调用了第"+ leve++ +"层low函数 | 参数 l r "+l+" "+r);
for (int i = 0; i < len; i++) {
int length1 = grid[i].length;
System.out.print(lev);
for (int i1 = 0; i1 < length1; i1++) {
System.out.print( grid[i][i1]+" ");
}
System.out.println();
}
System.out.println();
3 效果
调用了第0层low函数 | 参数 l r 0 0
0 1 1 1 0
1 1 0 1 0
1 1 0 0 0
0 0 0 0 0
调用了第1层low函数 | 参数 l r 0 1
0 0 1 1 0
1 1 0 1 0
1 1 0 0 0
0 0 0 0 0
调用了第2层low函数 | 参数 l r 0 2
0 0 0 1 0
1 1 0 1 0
1 1 0 0 0
0 0 0 0 0
调用了第3层low函数 | 参数 l r 0 3
0 0 0 0 0
1 1 0 1 0
1 1 0 0 0
0 0 0 0 0
调用了第4层low函数 | 参数 l r 1 3
0 0 0 0 0
1 1 0 0 0
1 1 0 0 0
0 0 0 0 0
调用了第5层low函数 | 参数 l r 1 1
0 0 0 0 0
1 0 0 0 0
1 1 0 0 0
0 0 0 0 0
调用了第6层low函数 | 参数 l r 2 1
0 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 0 0 0 0
调用了第7层low函数 | 参数 l r 1 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
0 0 0 0 0
调用了第8层low函数 | 参数 l r 2 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
进程已结束,退出代码0
4 调试步骤
分析打印的日志
然后在这里面找到有问题的函数调用,设置参数值的条件断点:
点击打上断点之后,右击断点,输入条件即可。
5 完整源码
因为博主在看别的博客的时候,有时看到截取的片段代码很难使用,或者理解。
这里提供操作所用的完整代码仅供参考,有帮助记得点赞收藏哦!
public class P200_NumberOfIslands{
static Integer leve = 0;
public static void main(String[] args) {
//测试代码
Solution solution = new P200_NumberOfIslands().new Solution();
String data = "[["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]";
Character[][] characters = ArrayUtil.StrToCharacterArray(data);
System.out.println(solution.numIslands(characters));
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int numIslands(Character[][] grid) {
int len = grid.length;
int res = 0 ;
for (int i = 0; i < len; i++) {
int l = grid[i].length;
for (int i1 = 0; i1 < l; i1++) {
if (grid[i][i1] == '1'){
/**/
low(i, i1, grid);
res++;
}
}
}
return res;
}
//输入:grid = [
// ["1","1","1","1","0"],
// ["1","1","0","1","0"],
// ["1","1","0","0","0"],
// ["0","0","0","0","0"]
//]
public void low(int l , int r,Character[][] grid){
grid[l][r] = '0' ;
int length = grid[l].length;
int len = grid.length;
String lev = "";
for (Integer i = 0; i < leve; i++) {
lev += " ";
}
System.out.println(lev+"调用了第"+ leve++ +"层low函数 | 参数 l r "+l+" "+r);
for (int i = 0; i < len; i++) {
int length1 = grid[i].length;
System.out.print(lev);
for (int i1 = 0; i1 < length1; i1++) {
System.out.print( grid[i][i1]+" ");
}
System.out.println();
}
System.out.println();
/*右*/
while( r+1 < length && grid[l][r+1] == '1' ){
low(l , ++r,grid);
}
/*左*/
while(0< r-1 && grid[l][r-1] == '1' ){
low(l , r--,grid);
// grid[l][r-1] = '0';
// r--;
}
/*上*/
while(0<l-1 && grid[l-1][r] == '1' ){
low(l-- , r,grid);
// grid[l-1][r] = '0';
// l--;
}
/*下*/
while(l+1 < len && grid[l+1][r] == '1' ){
low(++l , r,grid);
// grid[l+1][r] = '0';
// l++;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
相关文章
- 2022年云计算发展趋势
- 有了这个“仿生鼻子”,新冠幸存者将有机会重新「细嗅蔷薇」
- Gartner:六个步骤制定云战略
- 深入浅出话Wi-Fi,买路由器必看
- 云计算支出再次增长,未来还会有更多
- HTTPS - TLS 1.3 为何性能和安全性更高?
- 云计算和开源时代的锁定
- 6G网络能终结城市拥堵吗?
- 5G专网混战已打响
- 五个常见的云问题及解决方法
- 阿里巴巴云原生混部系统 Koordinator 正式开源
- 我们一起聊聊世界通信简史
- 2022年92个令人惊叹的人工智能统计数据和事实
- 企业为迎接下一个云计算事件做好准备了吗?
- 云迁移和管理成本偏离轨道的不同方式及管理措施
- 中国太赫兹实验系统实时传输净速率超100Gbps
- 打破电力巡检的边界,少不了这些新技术
- 企业的ERP软件需要人工智能辅助的五个原因
- 相较本地化部署,云部署究竟有什么优势?
- 想要全屋WiFi覆盖 各类路由该怎么选