数据结构笔记总结(4.5)递归算法的调试

递归算法的调试

上一小节我们学习了递归实现的底层机理,这一小节我们来学习一下递归算法的调试。

其实这个方法也没有什么特别之处,就是打印输出,通过打印输出能清楚的看出我们程序是怎样一步一步获得最终结果的。

当然还有另外一种调试方式就是单步跟踪。

这一节我们还是使用LeetCode的那个题来演示,最终会在我们控制台上输出整个递归调用过程。

对于递归函数来说有一个非常重要的概念叫递归深度,也就是说每个程序调用自己,就可以说递归深度多了1。

递归深度是一个非常重要的概念,它可以帮我们理解递归的变量,我们添加一个函数叫depth代表递归深度,初始调用递归深度为0,具体演示代码如下:

public class Solution {

    public ListNode removeElements(ListNode head, int val, int depth) {

        String depthString = generateDepthString(depth);

        System.out.print(depthString);
        System.out.println("Call: remove " + val + " in " + head);

        if(head == null){
            System.out.print(depthString);
            System.out.println("Return: " + head);
            return head;
        }

        ListNode res = removeElements(head.next, val, depth + 1);
        System.out.print(depthString);
        System.out.println("After remove " + val + ": " + res);

        ListNode ret;
        if(head.val == val)
            ret = res;
        else{
            head.next = res;
            ret = head;
        }
        System.out.print(depthString);
        System.out.println("Return: " + ret);

        return ret;
    }

    private String generateDepthString(int depth){
        StringBuilder res = new StringBuilder();
        for(int i = 0 ; i < depth ; i ++)
            res.append("--");
        return res.toString();
    }

    public static void main(String[] args) {

        int[] nums = {1, 2, 6, 3, 4, 5, 6};
        ListNode head = new ListNode(nums);
        System.out.println(head);

        ListNode res = (new Solution()).removeElements(head, 6, 0);
        System.out.println(res);
    }

}

运行一下程序,分析结果

如图所示,首先打印的是“-”,这个“-”越长,就相当于递归调用深度越高,同样多的“-”代表同一深度。

源码下载

[dm href='https://www.jikewenku.com/product/1487.html']下载地址[/dm]

导航目录

[dm href='https://www.jikewenku.com/geeknote/2241.html']查看导航[/dm]

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » 数据结构笔记总结(4.5)递归算法的调试

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多