[英]How can I solve this problem with recursion in Java?
'''
public static int[] generateNumbers(int start, int end) {
// case for empty array
if (start > end) {
int returnEmptyArray[] = {};
return returnEmptyArray;
}
// setting size of the result array
if (start < 0) {
int sizeOfArray = end - start - 1;
int result[] = new int[sizeOfArray];
}
// setting size of the result array
if (start > 0) {
int sizeOfArray = end - start;
int result[] = new int[sizeOfArray];
return generateNumbers(start, end, 0, result);
}
return null;
}
// helping method for recursion
public static int[] generateNumbers(int start, int end, int i, int[] result) {
i = start;
if (i < end) {
result[i] = i;
i++;
}
return generateNumbers(start, end, ++i, result);
}
大家好你们好。 我已经尝试了我能想到的一切来解决这个问题。 这个程序应该从头到尾递归地向上计数,最后也应该包括负数。 结果应放入 integer 数组中: 示例:start, 2: end, 5 --> result = {2, 3, 4: 5} start, -4: end, 3 --> result = {-4, -3, -2, -1, 0, 1, 2, 3}
我会非常感谢代码片段和解释,或者至少是我可以解决这个问题的方法。
谢谢!
您的代码中有一些非常奇怪的部分。
例如这个:
if (start < 0) {
int sizeOfArray = end - start - 1;
int result[] = new int[sizeOfArray];
}
毫无意义,您在if
条件下创建局部变量并且从不使用它们。
您对sizeOfArray
的计算是错误的,它应该是end - start + 1
,而且,没有理由检查 start 是正数还是负数,全部放弃。 然后,删除return null
,这是一个死代码。
对于您的子程序 function,您不能只在与您要写入的数字相同的索引上写入数组,您将得到ArrayIndexOutOfBoundsException
。 例如,如果您的开始是-4,您基本上(在第一次通话中)会尝试执行result[-4] = -4
,这显然是无稽之谈。
更好的解决方案是在i
中保存索引值(从 0 开始)并将该值添加到 start: result[i] = start + i
。
此外, ++i
调用是错误的,因为您在它之前调用i++
,所以您实际上将 i 增加了 2 而不是 1。
您的子程序也没有终止条件 - 它永远不会结束。 试着把它的格式:
if(...) {
...
return generateNumbers(...);
}
return result;
顺便说一句,您显然需要在更改i
的操作后编辑您的条件。
而不是给你一个解决方案,我将通过推理如何找到解决方案。
[我们都完全理解,以这种方式创建这样一个整数数组是一种递归思维的练习,而不是在生产质量的软件中以这种方式完成。 ]
递归的两个主要问题始终是:
generateNumbers(3,7)
,如何通过重新使用相同类型的“更简单”任务的结果来解决它?一种可能的答案是(还有其他可能性):
generateNumbers(3,6)
的结果,我只需要 append 最后的 7,然后我就明白了。 广义:解决问题generateNumbers(start,end-1)
,然后附加end
。start
大于end
,则结果是一个空数组。实现这一点很简单,有一个怪癖:在 Java 中向数组附加一些东西并不容易。 你可以:
List
数据类型而不是数组(如果您的课程已经涵盖了这一点)。 附加到List
很容易。int[] append(int[] arraySoFar, int newValue)
方法,从而使递归中的“追加”步骤变得容易。 该方法必须创建一个比输入长的新数组,将输入复制到那里,并在末尾插入新值。只是为了向您展示可以有许多不同的方式使用 resursion 来解决您的问题,这里有一些其他的方法:
generateNumbers(3,7)
,您可以在中间找到一些数字,例如 5,然后通过附加generateNumbers(3,5)
和generateNumbers(6,7)
来求解,这意味着您创建了一个generateNumbers()
的结果通过巧妙地组合两个递归调用的结果来调用。 public static int[] generateNumbers(int start, int end) {
int length = end - start + 1;
if(length <= 0) {
// throw an exception
}
int[] numbers = new int[length];
generateNumbers(start, end, 0, numbers);
return numbers;
}
public static void generateNumbers(int start, int end, int index, int[] numbers) {
if(start > end) {
return;
}
numbers[index] = start;
generateNumbers(start + 1, end, index + 1, numbers);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.