家庭作业:Java中的魔法植物递归练习

时间:2017-11-02 14:07:30

标签: java eclipse recursion

为清楚起见,这是我的编程II课程的分级作业。我一般都非常容易接受新的编程概念,但这种特殊的递归分配实际上是在抛弃我,我正在寻找一些正确的方向。下面是逐字分配和我目前已有的代码。

魔法植物

我们有一种神奇的植物,一旦种植,它会在第一年发芽并长出两片叶子。它每年都会使它的叶子翻倍,不过每三年它的叶子就会增加三倍。类似的东西:

Link to table displayed in my homework document

编写一个名为MagicPlant的类,其中包括以下方法:

  • 返回给定植物年龄的叶子数的方法
  • 一种非递归方法,它根据叶子的数量返回植物的年龄。
  • 一种递归方法,它根据叶子的数量返回植物的年龄。

在驱动程序类中测试方法。

找出算法和数据结构可以处理的最大(最旧)工厂是什么。

这就是我给出的,我在最后一个要点上遇到了麻烦,而且在第二个要点上有些混乱(但我的代码似乎有效)。

我当前的代码不包括Driver类,因为它只是调用语句:

public class MagicPlant {

    // Method that returns the number of leaves given
    // the age of the plant.
    public int getLeaves(int age) {
        int leafCount = 1;
        for (int i = 1; i <= age; i++) {
            if (i % 3 != 0) {
                leafCount *= 2;
            } else {
                leafCount *= 3;
            }
        }
        return leafCount;
    }

    // Non-recursive method that returns the age of the plant
    // given the number of leaves.
    public int getAgeNR(int leaves) {
        int age = 1;
        while (leaves > getLeaves(age)) {
            age++;
        }
        return age;
    }

    // Recursive method that returns the age of the plant
    // given the number of leaves.
    public int getAgeR(int leaves) {
        return 0;
    }
}

2 个答案:

答案 0 :(得分:1)

我的tipp是用递归代替while - 循环。因此,您没有局部变量,而是将该变量返回到方法中(递归)。

另外我建议你为递归制作两种方法:

public int getAgeR(int leaves){
     return getAgeR(1, leaves); // call overload with initial value
}

private int getAgeR(int age, int leaves){
     // do your magic here
}

答案 1 :(得分:0)

// Recursive method that returns the age of the plant
// given the number of leaves.
public int getAgeR(int leaves) {
    if(leaves == 2) {
        return 1;
    }
    if(leaves % 3 == 0) {
        return getAgeR(leaves/3)+1;         
    } else {
        return getAgeR(leaves/2)+1;
    } 
}

这与数年相反。而不是从头开始,你只需要从结束开始,逐渐减少每个循环循环。