【发布时间】:2016-04-04 10:54:55
【问题描述】:
我被分配了一个java作业任务,它涉及一个复活节彩蛋游戏,当我给你n个鸡蛋时开始,当你剩下正好m个鸡蛋时结束。在游戏的任何阶段,假设你还剩n个鸡蛋,那么你可以回馈一些鸡蛋,但你必须遵守以下规则:
• 如果 n 是偶数,那么您可以返还正好 n/2 个鸡蛋。
• 如果 n 可以被 3 或 4 整除,那么您可以将 n 的最后两位数相乘并返回 很多鸡蛋。
• 如果 n 能被 5 整除,那么您可以返还正好 m 个鸡蛋。
• 如果n 是一个素数,那么你可以只返还一个鸡蛋。
我必须编写一个名为 picnic 的函数,如果通过以某种顺序应用规则,我们还剩下 m 个鸡蛋,它将返回 true;否则为假:
public static boolean picnic(int n, int m) { … }
我的任务是:
a) 提供 picnic(int n, int m) 的递归关系
b) 使用递归关系在 Java 中实现递归函数
c) 为 picnic(250, 42) 开发完整的递归调用树
d) 这里的递归模式是什么? (尾递归与否?树还是线性递归?)
e) 这个函数是否提醒了任何算法设计策略?如果有,是哪一个?
我已经完成了问题 a) 的回答:
public class EasterEggs {
public static boolean picnic (int n, int m) {
if (n == m)
return true;
else return (picnic(n,m));
}
}
而且我不确定如何实现递归函数。我尝试了几次,但仍然没有。
问题 b 和 c 是我最大的问题 atm,我确信我可以弄清楚 d 和 e。有人可以帮我解决这个问题吗?并可能告诉我如何实现它?
【问题讨论】:
-
如果 n!=m 递归永远不会终止(导致溢出)。
-
@blazs 那是因为代码只回答 a) 而不是(还)b)
-
您对 picnic 的递归调用,必须将 n 替换为小于 n 的数字。为此,请应用每条可能的规则,并在应用规则后对剩余的号码使用 picnic。此外,您应该检查 n 时的情况
-
规则相互冲突:例如,如果 n 可以被 4 整除,那么它也是偶数,而 5 是可以被 5 整除的素数。你是否应该在规则?
标签: java algorithm recursion tail-recursion recurrence