我必须编写一个方法来比较字符串数组中的元素并返回最大元素的索引。它将使用分而治之的方法递归地完成。我有一个想法,我只是想看看我的想法是否正确,或者是否应该以不同的方式完成。
我打算从左侧查看数组到mid
-1,然后查看mid
,然后向右看mid
+1。我有一个变量,它将跟踪最大的索引,然后在那之后进行左侧和右侧的递归调用。
听起来这是解决这个问题的好方法吗?
这是我到目前为止所做的:
public int longest()
{
longest(0, a.length-1);
return longestIndex;
}
private int longest( int left, int right)
{
int longestIndex;
int mid;
if(left > right)
{
longestIndex = -1;
}
else if(left == right)
{
longestIndex = 0;
}
else
{
longestIndex = 0;
mid = (left + right) / 2;
longest(left, mid - 1);
if (a[mid].compareTo(a[longestIndex]) > 0)
{
longestIndex = mid;
}
longest(mid + 1, right);
}
return longestIndex;
}
此外,由于这些方法应该返回一个int,我如何将私有方法的longestIndex传递给public方法,以便在调用最长时间时显示在我的测试程序中?
答案 0 :(得分:4)
是否具有递归功能?对此使用递归听起来像是:
反正你的递归看起来完全错了,因为你不仅没有跟踪实际的索引,而且你的基本情况和递归调用没有任何意义。
如果我强迫使用递归,我会做类似的事情:
int longest(array):
return longest_helper(0, 0, array)
int longest_helper(max_index, curr_idx, array):
# base case: reached the end of array
if curr_idx == array.length:
return max_index
if array[curr_idx].length > array[max_index].length:
max_index = curr_idx
# recursive call
return longest_helper(max_index, curr_idx + 1, array)
然后我会放弃课程,并告诉教授给学生一些问题,其中递归实际上是有用的。
由于它看起来不像数组是排序的,所以最简单(也是最快)的方法就是完成整个过程(伪代码):
max_index = 0
max_length = array[0].length
for index in 1 .. array.length:
if array[index].length > max_length:
max_length = array[index].length
max_index = index
return max_index
答案 1 :(得分:0)
这是你递归两天内的第四个问题。你正在编写家庭作业标签是件好事,但你最好花时间了解递归是如何工作的。
我的建议是拿一些彩色光盘(单个套件的扑克筹码或扑克牌工作得很好),手动解决Towers of Hanoi的递归解决方案,然后回过头看看你有的个别问题一直在问。
您很可能会自己回答所有问题。你也可以接受答案,增加你在面对更严峻的问题时获得答案的机会。