【问题标题】:What makes a data structure recursive?是什么让数据结构递归?
【发布时间】:2018-01-27 09:47:16
【问题描述】:

我正在阅读有关 Recursive Data Type 的内容,其中引用了以下内容:

在计算机编程语言中,递归数据类型(也称为递归定义、归纳定义或归纳数据类型)是一种数据类型,其值可能包含相同类型的其他值

我知道链表和树可以是递归数据类型,因为它包含相同数据结构的较小版本,就像树可以有子树一样。

但是,我真的很困惑,因为固定大小的数组不是也包含子数组吗?哪个还是同一类型?

有人可以举例说明是什么让数据结构递归的吗?

【问题讨论】:

  • ` 不是固定大小的数组,也可能包含子数组,但这不是设计使然。按照设计,class Node { public Node Parent; public Node[] Children; } 一个节点有一个节点作为它的父节点,一个节点数组作为它的子节点。根据定义,它会递归,不仅仅是因为它有一个包含另一个节点的数组。

标签: recursion linked-list tree graph-algorithm


【解决方案1】:

数据类型描述了数据如何存储(至少在逻辑上;在更深的层次上,无论如何只有数字、位、晶体管等)。虽然一个数组(但只有一个非空的)可以被认为是一个东西加上另一个(子)数组(这种方法通常用于 Lisp 和 Prolog 等语言中的列表),但它通常是按元素存储的。

例如,Prolog 中的列表定义为空列表(一种特殊情况)或与另一个列表(称为tail)连接的元素(称为head)。这使得递归数据类型。

另一方面,C 中的列表可以定义为struct list { char[100] data; int length; }。这里list 没有用于list 的定义方式(仅使用了char[]int),因此它不是递归数据类型。

【讨论】:

    【解决方案2】:

    但是,我真的很困惑,因为固定大小的数组不也包含子数组吗?

    从概念上讲,您可以说每个数组都“包含”子数组,但数组本身并不是由代码中的较小数组组成的。数组由连续的元素组成,而不是其他数组。

    一个递归结构(就像你提到的,一个链表),字面上包含它自己的版本:

    class Node {
        Node head = null; // <-- Nodes can literally hold other Nodes
    }
    

    然而,如果您将数组表示为具有元素固定字段的类,它包含 元素,而不是其他数组:

    class Array<E> {
       E elem1 = ...; // <-- In the code, an array isn't made up of other arrays,
       E elem2 = ...; //      it's made up of elements.
        ...
    }
    

    (这是一个糟糕的、不准确的数组表示,但它是我能用简单代码交流的最佳方式)。

    如果在浏览结构时遇到整个结构的“较小”版本,则该结构是递归的。在数组中导航时,您只会遇到数组包含的元素,而不是较小的数组。

    但请注意,这完全取决于结构的实现。例如,在 Clojure 中,“向量”的行为本质上与数组相同,在使用它们时可以将其视为数组,但在内部,它们实际上是一棵树(本质上是一个多子链表)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 2018-05-06
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多