如何调试递归程序,有何技巧?
创始人
2025-05-28 01:49:22
0

前言

我是在用idea调试java的二路归并的? [200]岛屿数量 Medium 2023-03-08 191的时候被单步调试弄得快要疯了才来搜索这个问题的,然后看到回答里面说打印,我真的想捶我自己(别笑QAQ,我只是一时没想到)。


leetcode如何调试递归程序,有何技巧?

  • 前言
  • 1 递归代码
  • 2 函数头下面输出
  • 3 效果
  • 4 调试步骤
  • 5 完整源码

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(0low(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);

我还想知道每一个调用函数是第几层,如果这一大坨输出有缩进会不会更好一点呢?缩进简单,输出制表符“\t”就好。但是输出几个呢?

所以需要用一个计数的变量来计算目前递归的层数,进而产生缩进效果。有两个方法,一个方法是我敲这些字的时候想到的,全局变量,在函数头自增1,在函数尾自减1,就可以知道当前递归层数。

我用的是静态变量。对于一个函数里面的静态变量来说,使用static关键字声明并初始化它之后,这条声明语句会在下一次执行时忽略,并且这个静态变量会一直活到程序结束,不像其他函数中声明的局部变量一样命短。其实这也相当于是一种全局变量,只不过是在调用这个函数的时候才创建出来。其他和第一种方法一样,在函数头自增1,在函数尾自减1。

然后在想要缩进的地方前面加上:

提交代码

		String lev = "";for (Integer i = 0; i < leve; i++) {lev += "\t";}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 10 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 调用了第2层low函数 | 参数 l r 0 20 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 调用了第3层low函数 | 参数 l r 0 30 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 调用了第4层low函数 | 参数 l r 1 30 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 调用了第5层low函数 | 参数 l r 1 10 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 调用了第6层low函数 | 参数 l r 2 10 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 调用了第7层low函数 | 参数 l r 1 00 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 调用了第8层low函数 | 参数 l r 2 00 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 += "\t";}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(0low(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)}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...