当前位置: 首页 > 知识库问答 >
问题:

递归toString方法

景育
2023-03-14

我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该:

toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)

我让我的公共toString方法工作;

    public String toString() {
    int size = getSize();
    String str = "{ ";
    Link current = first;

    for(int i = 0; i < getSize(); i++, current = current.next) {
        str += current.getiData() + " ";
    }

    str += " }";
    return str;
}

(我知道我应该使用StringBuilder,只是暂时使用=。)但是对于私有方法,我甚至不知道要写它。现在我能想到的唯一方法是:

private String toString(int x) {
    if(i > 0) {
        toString(--x);
    }
    return ", ";
}

这是愚蠢的(真的不是递归),有人能澄清应该做什么,和/或给出伪代码吗?

共有3个答案

刘玉石
2023-03-14

这有点奇怪,因为toString方法的签名没有参数,这意味着需要另一种方法。在链表中,每个节点都有数据和指向下一个节点的指针。

public String getData(Node n, String value)
{
     if(n == null)
     {
         // We know we're at the end, so don't proceed.
         return value;
     }
     else
     {
         // n isn't empty, and ignoring the lack of stringbuilder
         value += n.getData();
         // Make a recursive call with the next value in the list, and the new string.
         return getData(n.next(), value);
     }
}
盛嘉
2023-03-14

您想要这样的东西(给出了递归的基本思想,但行不通)

privat String toString(Link link) {
  if (link.isLast()) {
    return link.value();
  }
  else {
    return link.value() + toString(link.next());
  }
}
高运诚
2023-03-14

我认为从代码的角度来看,其他答案是合适的,但我只是想添加更多的理论来帮助您理解如何到达那里。在进行递归时,您总是需要两件事:基本情况和递归情况。基本情况是非常简单的解决方案,递归情况是您如何解决可解决的简单情况。

链表本身就是一种递归数据结构。例如,如果有一个包含10个项目的链接列表,则可以将其作为一个节点,并将包含9个项目的链接列表附加到该节点。

因此,对于基本情况(再次借用@Chris的答案),执行toString()的最简单列表是一个空列表。所以你的基本情况看起来像这样(伪代码):

if(list is empty)
{
   return "";
}

那么,递归案例需要使用现有的链表,并尝试向下处理基本案例。做到这一点最简单的方法是,从你知道你能解决的问题中分离出一小块,解决它,然后处理剩下的稍微小一些的问题。在打印链接列表的情况下,这意味着您可以从列表中获取一个项目,将其转换为字符串,然后再考虑列表的其余部分。因此,您的递归案例将如下所示(伪代码):

if(list is not empty)
{
   String x = take the current node and translate it to a string;

   Add x to your running value of the String value of the entire list

   Recursively call this function with the next node in the list
   (you reduce your list size by 1 with each call and work down to your base case of an empty list)
}

希望这能帮助您理解如何递归地找到这个问题的解决方案。当然,在如何使其发挥作用方面有很多变化;没有一种“正确”的递归方式,就像没有一种“正确”的循环编写方式一样,但一般的“基本情况”和“递归情况”思维模式通常是最好的起点。

 类似资料:
  • 我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于

  • 我需要为链表队列实现一个toString()递归方法。我知道我的toString方法在我上周做的一个链表实现中工作得很好,所以我在处理它的队列方面出了问题。 我的QueueList的toString方法: 以及我的构造函数,例如QueueList: 我试图用这个测试看看里面发生了什么: 与输出 我意识到这是因为我说的是前面的在方法的递归部分,但即使我将其更改为,我的输出是 这可能与我的排队和退队方

  • 我在深度优先搜索算法实现的递归方法方面遇到了一些麻烦。这是二叉树照片: 该方法在树的右侧(55、89、144)工作得很好,但是当它来到左侧时,它返回nil,即使它输入“是”。那么,代码有什么问题呢?节点是Node类的一个实例,它具有值(整数)并链接到左右子级(Node类的其他实例),如果它没有来自该侧的子级,则为nil。 下面是方法代码:

  • 我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的

  • 问题内容: 我在使用Java中的基本递归问题时遇到了很多麻烦;任何指针都很棒。 “写一种静态递归方法来打印出几何序列的第n个项:2、6、18、54。” 据我所知,我应该在代码中的某处递归地将某物乘以3,但我一直在努力寻找方法。我知道我需要终止声明,但是何时发生?我需要帮手方法吗? 问题答案: 一个递归函数是一个函数,它的实现引用自身。以下是一些有趣的示例: 解决问题的方法: 编辑 : 上面的类使用

  • 我很难确定简单递归方法的大O。我不知道当一个方法被多次调用时会发生什么。我想更具体地谈谈我的困惑领域,但目前我正试图回答一些硬件问题,为了不想作弊,我要求任何回复本文的人提出一个简单的递归方法,并对所述方法的大O进行简单解释。(最好是Java语言……我正在学习的一种语言。) 谢谢你。