递归方法将列表中的项目作为参数并在其后检查其余项目?

时间:2019-03-27 19:35:38

标签: java

我是编程新手,我被要求在一个名为isInIncreasingOrder()的LinkedList类中为实例方法编写代码,该类返回一个布尔值,该布尔值指示列表中的数据是否按升序排列。

一些要求:

i。该方法必须是递归的。进行直接递归很有意义 将列表中的Item作为参数并检查 之后的剩余物品。

ii。您需要检查以确保列表中至少有一项 在调用递归方法之前。

我正在努力弄清楚如何制作执行上述操作的递归函数。我尝试遵循老师在课堂上递归函数的示例(这是导致以下代码的原因),但它实际上与方法的准则不符。我真的不知道该如何处理'Item it'参数。

我很自信可以满足第二个要求,但是我很难满足第一个要求。任何帮助或朝正确方向的推动将不胜感激。说实话,一般而言,递归使我感到困惑。

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<div class="grandparent">
  <div class="parent">
    <span class="left-side">First Text!</span>
    <span class="must-be-centered">SOME TEXT!</span>
    <span class="right-side">Other Text!</span>
  </div>
  <div class="parent">
     <span class="must-be-centered">SOME TEXT!</span>
  </div>
</div>

这是整个课程的代码:

https://pastebin.com/MJR8TUTG

2 个答案:

答案 0 :(得分:0)

好的,这样想。

在以下情况下,列表按升序排列:

当前列表项(在您的示例中是)没有下一个乱序的项

AND

该项目也符合相同的条件(因此也适用于递归)。

因此,假设Item中包含nextItem ...

public boolean isInIncreatingOrder(Item it) {
   if (it == NULL) {
       return true; // No items is always sorted
   }
   if (it.nextItem == NULL) {
       return true; // nothing after this item means it's sorted
   }
   return it.compareTo(it.nextItem) < 0 && isInIncreasingOrder(it.nextItem);
}

第一个if检查NULL列表。第二个if用于最后一个项目-根据定义,后面不能有超出项目的内容。

return语句是魔术。首先确保与下一个项目相比该项目的相对顺序。如果失败,则说明您的订单混乱,返回的结果为false。

如果成功,则列表的其余部分顺序正确。

递归。

这真的很重要,@ GilmoreGirling。您真的真的需要了解这一点。这很简单,但一开始可能很难将头缠绕在头上。

答案 1 :(得分:0)

现在,您的函数会遍历列表,而这根本不是递归的。

关于链接列表的事情是,每个项目都指向下一个。我不知道您的特定实现,但是我假设可以按照标准使用it.next检索下一项。

在这种情况下,递归的概念是关于如何将isInIncreasingOrder函数用于返回作为参数传递的项之后的所有项的顺序是否递增。您只能访问该单个项目,而不能访问整个列表(也许您想查看某个元素之后的所有内容是否都按顺序排列,而不是如果整个列表都按顺序排列)。因此,您问自己:“如何利用仅将单个项目作为参数的单个函数来验证所有后续项目?”。当您考虑时,答案很简单:检查下一项是否与您的顺序递增,如果是,则请该项执行相同的操作。

所以你会有类似的东西:

public boolean isInIncreasingOrder(Item it) {
    if (it.value < it.next.value) {
        return isInIncreasingOrder(it.next) // It is increasing, so pass it to the next item
    }
    else {
        return null
    }
}

当然,您将必须添加条件检查,以便检查条件何时出现。next指向空(列表末尾)。

希望这会有所帮助