为清楚起见,这是我的编程II课程的分级作业。我一般都非常容易接受新的编程概念,但这种特殊的递归分配实际上是在抛弃我,我正在寻找一些正确的方向。下面是逐字分配和我目前已有的代码。
魔法植物
我们有一种神奇的植物,一旦种植,它会在第一年发芽并长出两片叶子。它每年都会使它的叶子翻倍,不过每三年它的叶子就会增加三倍。类似的东西:
编写一个名为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;
}
}
答案 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;
}
}
这与数年相反。而不是从头开始,你只需要从结束开始,逐渐减少每个循环循环。