繁体   English   中英

如何通过 Java 中的递归解决这个问题?

[英]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) ,如何通过重新使用相同类型的“更简单”任务的结果来解决它?
  • 什么任务如此简单以至于我想直接解决它? 我应该选择一个在应用我的问题 1 中的简化策略时肯定会到达的案例。

一种可能的答案是(还有其他可能性):

  • 如果我知道generateNumbers(3,6)的结果,我只需要 append 最后的 7,然后我就明白了。 广义:解决问题generateNumbers(start,end-1) ,然后附加end
  • 如果start大于end ,则结果是一个空数组。

实现这一点很简单,有一个怪癖:在 Java 中向数组附加一些东西并不容易。 你可以:

  • 使递归更复杂,首先创建一个足够长的数组来保存最终结果,并在递归调用中跟踪 position 到 append 新数字的位置。
  • 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM