在Java

时间:2017-06-29 16:42:04

标签: java class recursion

假设您有一个最多可包含50个对象的盒子。奇怪的是,该框还可以包含另一个框(最多可以包含50个对象),并且这个“嵌套”框不占用外框中的任何空间。

“嵌套”框也可以包含另一个框,依此类推......无限广告。

因此,我写了一个服务类Box如下:

class Box {

  private Box nestedBox;

  public Box getBox() {
    return nestedBox;
  }

  //other code
}

允许用户创建他喜欢的任意数量的盒子。但他创造的每个盒子都会嵌套在“最深”的盒子里面。

所以,例如,如果他想创建三个框:第一个框将首先创建,然后第二个框将在第一个框内创建,最后,第三个和最后一个框将在第二个框内创建框。

如何编写执行此创建的程序?我被告知要使用递归之类的东西。

这是我的尝试:

public static void main(String[] args) {

  int numOfBoxes;
  Scanner sc = new Scanner(System.in);

  numOfBoxes = sc.nextInt();

  if (numOfBoxes == 1) {
    Box b = new Box();
  } else {
    Box b = new Box();
    for (int i = 1; i < numOfBoxes; i++) {
      b.getBox() = new Box();
    }
  }

}

如果有人可以帮助我,我真的很感激。随意更改类Box和主要方法。我被告知使用递归,但我无法弄明白。

3 个答案:

答案 0 :(得分:1)

正如您所描述的那样(每个框最多包含1个框),您拥有的实际上是一个链表。你不需要递归,只需走一下列表,将当前框保存在一个变量中。

但是你可能想要解决的问题(盒子可以包含多个盒子)是一棵树,你需要的是一棵树的搜索功能。在不知道树中预期节点分布的任何内容的情况下,我强烈建议执行DFS(https://en.wikipedia.org/wiki/Depth-first_search),因为这很容易实现,并且在广泛的树类型上具有高性能。

答案 1 :(得分:1)

一种方法是保留对最大框的引用。

<rule name="Change Location Header" enabled="true">
                <match serverVariable="RESPONSE_LOCATION" pattern="^http(s)?://([^/]+)/(.*)" />
                <conditions logicalGrouping="MatchAny" trackAllCaptures="true">
                    <add input="{RESPONSE_STATUS}" pattern="^301" />
                    <add input="{RESPONSE_STATUS}" pattern="^302" />
                </conditions>
                <action type="Rewrite" value="http{R:1}://{R:2}/{R:3}" />
            </rule>

答案 2 :(得分:0)

或者,如果您确实需要使用递归解决方案构建框,则可以在构造函数中执行此操作。例如:

import java.util.Scanner;

class Box{

    private Box nestedBox;

    public Box(int numOfInnerBoxes){
        if (numOfInnerBoxes > 0) {
            this.nestedBox = new Box(numOfInnerBoxes - 1);
        }
        System.out.println("This box "+ this +" contains box "+ this.nestedBox +".");
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numOfBoxes = sc.nextInt();
        Box outerBox = new Box(numOfBoxes-1);
        System.out.println("The outermost box is "+ outerBox +".");
    }

}

示例输出:

$ java Box
4
This box Box@55f96302 contains box null.
This box Box@3d4eac69 contains box Box@55f96302.
This box Box@42a57993 contains box Box@3d4eac69.
This box Box@75b84c92 contains box Box@42a57993.
The outermost box is Box@75b84c92.

请注意,每个构造函数都会减少要创建的内部框的数量,直到达到零。这是递归解决方案的本质。