java - 关于递归的问题,尝试安排最大事件数

标签 java recursion

我正在研究递归,试图更好地利用它。我当前的 Activity 是尝试编写一种递归方法来生成可以安排的最大数量的事件。到目前为止我的方法如下:

 public int maxEvents(int n, int[] Start) {
  if(n<=0) return 0;
  if(n==1) return 1;
  else return maxEvents(n-1, Start) + maxEvents(Start[n]-1, Start);
 }

基本上,我的 main 方法向 maxEvents 传递一个 int n,这是最后一个事件。假设我有 4 个事件 (1-4),那么 n 就是 4。下一部分是一个数组,索引处的值是事件开始的时间,索引本身是事件结束的时间。

前提条件是:

n >= 0

日期和惯例从 1 到 n

事件 n 在第 n 天结束(并包括)并在 Start[n] 开始

Begin[0] 未使用

对于从 1 到 n 的所有 i,Begin[i] <= i (当然,约定 i 的开始日不能晚于结束日。)

最后我的方法应该返回:

如果您必须仅从 session 1 到 n 中进行选择,则可以主办的 session 的最大数量。 (如果 n = 0,则该集合为空)

一些输入/输出示例:

n = 3 开始[1]=1 开始[2]=1 开始[3]=3

最大事件数=2

或者:

n = 5 开始[1]=1 开始[2]=1 开始[3]=2 开始[4]=3 开始[5]=4

最大事件数=3

<小时/>

我的两次递归调用应该在不邀请n的情况下计算最大数量,然后您可以从1到n-1中选择。并计算邀请n的最大数量,注意Begin[n]-1是与约定n的开头不冲突的最后一个约定。然后我可以取两者中的最大值,然后返回。

我尝试使用不同的 if 语句,例如:

if("递归调用1">"递归调用2"){ 返回“递归调用1”; }

并使用类似“maxEvents(Start[n]-1, Start)”作为我的递归调用之一(如我上面的代码中使用的),但它没有返回正确的值,如我上面列出的值。总而言之,我在递归的概念上遇到了麻烦,而且我知道我的递归调用出了问题,所以如果有人能指出我正确的方向,那就太好了。谢谢!

最佳答案

这有效吗?

return Math.max(maxEvents(n-1, Start), 1 + maxEvents(Start[n]-1, Start))

这个想法是,您将分成两种互斥的情况:一种是不包含第 n 个事件,另一种是包含第 n 个事件。在两者中,您必须选择更大的。所以将两者相加是不正确的——取最大值才是正确的方法。但您还必须在第二个选项中添加 1 以考虑包括第 n 个事件。

关于java - 关于递归的问题,尝试安排最大事件数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4127067/

相关文章:

java - 是什么让 JavaFx 2 任务成功/失败

java - 使用 PDFBox 复制 pdf 可以像 iText 一样小吗?

php - 递归函数不返回任何内容

java - 使用递归时在根节点返回路径

javascript - 使用递归嵌套父子

java - 如何将参数传递给 JavaFX 应用程序?

java - 在集成测试之前启动主应用程序和测试应用程序

java - 如何将正则表达式与长度未知但处于特定模式的字符串进行匹配?

c++ - 递归函数 C++ 的问题

javascript - 异步内的递归