algorithm - 排序双链表插入中的递归

标签 algorithm recursion data-structures doubly-linked-list insertion

我是数据结构和递归概念的新手。我很难理解他为什么以及谁能够在这个概念中使用递归。我在论坛上找到了这段代码,但我无法真正理解它的概念。对于 2 1 3 4 的简单情况,如果有人可以解释迭代步骤,我将不胜感激。

这里是黑客排名的链接: https://www.hackerrank.com/challenges/insert-a-node-into-a-sorted-doubly-linked-list

Node SortedInsert(Node head,int data) {
    Node n = new Node();
    n.data = data;
    if (head == null) {
        return n;
    }
    else if (data <= head.data) {
        n.next = head;
        head.prev = n;
        return n;
    }
    else {
        Node rest = SortedInsert(head.next, data);
        head.next = rest;
        rest.prev = head;
        return head;
    }
}

最佳答案

递归: 递归意味着函数调用自身。对于需要保存多个状态(通常是大量状态)并以相反顺序检索它们的算法,它用作保存状态信息的简单方法。 (有更专业且不易出现内存问题的替代技术,例如使用 Stack 对象保存程序状态)。

这个例子很差,但是典型的递归介绍。是的,您可以使用递归遍历链表,但绝对没有理由这样做。循环会更合适。这纯粹是为了演示递归是如何工作的。所以,回答你的问题“为什么?”这很简单,您可以学习这个概念并稍后在其他实际有意义的算法中使用它。

当您拥有一棵树而不是链表时,递归很有用,其中每个节点都指向多个其他节点。在那种情况下,您需要保存您的状态(您在哪个节点上,以及您最后调用了哪个子节点),以便您可以遍历其中一个链接节点,然后返回并转到下一个节点。

您还问了“如何”。当一个函数调用自身时,它的所有变量都被保存(在程序堆栈中)并为它自己的下一次迭代创建新的变量。然后,当该调用返回时,它会返回到调用它的位置并加载前一组变量。这与“跳转”或某种循环有很大不同,后者每次都使用相同的变量副本。通过使用递归,每次调用时每个局部变量都有一个新副本。即使示例中的“data”变量也是如此,它永远不会改变(因此效率低下)。

关于algorithm - 排序双链表插入中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47600363/

相关文章:

java - 数据结构的工作方式类似于 Map,但允许随机更改键顺序

Python - 过滤重叠范围

java - 为通用递归程序生成递归树的程序

javascript - TypeScript 中的异步/等待递归树遍历

c++ - 意外的递归行为

algorithm - 构建堆时,堆是否唯一?

c - 如何在 C 中针对各种大小的缓冲区测试 WKdm 算法

python - 查找从一个列表中的点到另一个列表中的点的最小距离之和?

algorithm - 2 个神经元的 ANN 可以解决 XOR 问题吗?

java - 根据某些事件的时间组织时间表的算法?