Java 这本教科书的链表是否包含一个;递归构造函数";?
这是教科书实现中链表类的一个片段:Java 这本教科书的链表是否包含一个;递归构造函数";?,java,generics,linked-list,Java,Generics,Linked List,这是教科书实现中链表类的一个片段: public class ListItem { Object item; ListItem next; public ListItem(Object item) { this.item = item; next = null; } } 它看起来像递归——类ListItem的
public class ListItem
{
Object item;
ListItem next;
public ListItem(Object item)
{
this.item = item;
next = null;
}
}
它看起来像递归——类ListItem
的实例变量也被命名为ListItem
。这个递归合适吗
我曾经用Pascal定义过一个链表。我看到了一个您可能称之为递归的提示(pNodeType
,也称为^NodeType
),但它与Java代码段中的上述内容不同:
type
**pNodeType** = ^NodeType ;
NodeType = record
name : string ;
next : **pNodeType** ; // conceptually, change the type to **^NodeType**
end ;
所以我想,既然Java缺少指针,而且对象是引用,我还是在看同样的东西。对吧?
因此,如果我想要一个双链接列表(也是反向的),我会像这样添加一个实例变量
ListItem prev;
并向构造函数添加一行代码,如下所示
prev = null;
并采取与前向联系同样的谨慎措施
对吧?
最后,如果我想要一个通用的链表,我只需要像这样更改代码段,并将方法中出现的所有“Object”更改为“E”:
公共类列表项{
E项目;
下一个列表项;
公共列表项目(E项目){
this.item=项目;
next=null;
}
}
对吗?没有递归
当您声明与类相同类型的字段时,您不会实例化实例
您的构造函数是否包含初始化:
next = new ListItem(null);
ListItem next = new ListItem(null);
或者声明包括初始化:
next = new ListItem(null);
ListItem next = new ListItem(null);
会有递归
关于一般问题,您还需要键入字段:
public class ListItem<E> {
E item;
ListItem<E> next; // Added generic parameter
public ListItem(E item) {
this.item = item;
}
}
因为默认初始化值已经为null。没有递归
当您声明与类相同类型的字段时,您不会实例化实例
您的构造函数是否包含初始化:
next = new ListItem(null);
ListItem next = new ListItem(null);
或者声明包括初始化:
next = new ListItem(null);
ListItem next = new ListItem(null);
会有递归
关于一般问题,您还需要键入字段:
public class ListItem<E> {
E item;
ListItem<E> next; // Added generic parameter
public ListItem(E item) {
this.item = item;
}
}
因为默认初始化值已经为null。我看不到任何递归-构造函数不调用自身。拥有一个相同类型的实例并没有什么错——否则实现一个链表是非常困难的!这里没有递归。递归纯粹是一个运行时概念。看到你是对的,尽管别人的评论很奇怪。列表是递归数据结构,在数据类型级别存在递归,这导致递归算法(即使它们是使用退化为循环的递归实现的)。也就是说,构造函数本身并不是递归函数。指称语义必须使用一个固定点运算符来建模这样的类型。我看不到任何递归-构造函数不调用自身。拥有一个相同类型的实例并没有什么错——否则实现一个链表是非常困难的!这里没有递归。递归纯粹是一个运行时概念。看到你是对的,尽管别人的评论很奇怪。列表是递归数据结构,在数据类型级别存在递归,这导致递归算法(即使它们是使用退化为循环的递归实现的)。也就是说,构造函数本身并不是递归函数。指称语义必须使用一个定点运算符来对这样的类型进行建模。我没有否决,但在您的代码中也没有看到任何递归。@jim-huh?我的例子不是递归的吗?(确保刷新)Downvote,因为您说过“没有递归”。当您引用刚刚定义的东西的名称时,无论是函数、数据类型还是完全不同的东西,在任何情况下都存在递归。(这并不是说递归是计算机时代的最新发明,你知道……)@lngo在构造过程中没有递归,这就是这个问题,因为在构造过程中没有实例化自己的类。仅仅声明自己类的字段不是递归。我只是在字典中查找了“递归”:递归:见递归我没有否决,但在你的代码中也没有看到任何递归。@jim-huh?我的例子不是递归的吗?(确保刷新)Downvote,因为您说过“没有递归”。当您引用刚刚定义的东西的名称时,无论是函数、数据类型还是完全不同的东西,在任何情况下都存在递归。(这并不是说递归是计算机时代的最新发明,你知道……)@lngo在构造过程中没有递归,这就是这个问题,因为在构造过程中没有实例化自己的类。仅仅声明自己类的字段不是递归。我只是在字典中查找“递归”:递归:参见递归