我正在尝试使用递归试图变得更好。我当前的活动是尝试编写一个递归方法,该方法生成可以调度的最大事件数。到目前为止,这是我的方法:
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,这是最后一个Event。所以说我有4个事件(1-4)然后n将是4.下一部分是一个数组,它在索引处的值是事件开始的时间,索引本身就是事件结束的时间。
前提条件是:
n&gt; = 0
天和约定从1到n
事件n在(并包括)第n天结束,并从开始[n]
开始开始[0]未使用
对于从1到n的所有i,开始[i]&lt; = i(当然,我没有比结束日更晚开始的会议。)
最后我的方法应该返回:
如果必须仅从约定1到n中选择,则可以托管的最大约定数。 (如果n = 0,则此设置为空)
输入/输出的一些示例:
n = 3开始[1] = 1开始[2] = 1开始[3] = 3
maxEvents = 2
或者:
n = 5开始[1] = 1开始[2] = 1开始[3] = 2开始[4] = 3开始[5] = 4
maxEvents = 3
我的两个递归调用应该在不邀请n的情况下计算最大数量,然后您可以从1到n-1进行选择。并计算邀请n的最大数量,注意Begin [n] -1是最后一个与约定n的开头不冲突的约定。然后我可以取两者中的最大值,然后返回。
我尝试过使用不同的if语句,例如:
if(“recursion call 1”&gt;“recursion call 2”){ 返回“递归调用1”; }
使用像“maxEvents(Start [n] -1,Start)”之类的东西作为我的递归调用之一(就像我上面的代码中使用的那样)但是它没有返回正确的值,就像我上面列出的那样。总而言之,我对递归的概念有困难,而且我知道递归调用有问题,所以如果有人能指出我正确的方向那就太好了。谢谢!
答案 0 :(得分:1)
这有用吗?
return Math.max(maxEvents(n-1, Start), 1 + maxEvents(Start[n]-1, Start))
这个想法是你分成两个相互排斥的情况:一个不包括第n个事件,另一个包含第n个事件。在这两者中,你必须选择更大的。因此添加两者是不正确的 - 采取最大值是正确的方法。但是你还必须在第二个选项中加1,以便考虑包含第n个事件。