递归 - 堆栈溢出错误

Posted

技术标签:

【中文标题】递归 - 堆栈溢出错误【英文标题】:Recursive - stack overflow error 【发布时间】:2018-03-10 20:38:10 【问题描述】:

给定一个未排序的数组,找出最大值和最小值。我试图以递归、分而治之的方式做到这一点,但我不断收到堆栈溢出错误。我进行了调试,并且在递归调用中不断收到错误,但不知道出了什么问题或如何修复它。

我确实有静态最小和最大变量。

感谢您的信息和帮助!

static void findMaxMin(int[] array, int start, int end)

    if (end == 2)
    
        setMaxMin(array);
    
    else
    
        int mid = ((end) / 2);
        findMaxMin(array, start, mid);
        findMaxMin(array, mid + 1, end);
    

private static void setMaxMin(int[] array)

    if (array[0] > array[1])
    
        max = array[0];
        min = array[1];
    
    else
    
        min = array[0];
        max = array[1];
    

【问题讨论】:

似乎你错过了退出点,你需要告诉代码什么时候应该停止。例如开始 >= 结束。 我怀疑你的递归基本条件。 好吧,setMaxMin 只查看前两个索引,所以如果数组更长,这将如何工作, 使用队列移除递归。 你为什么要为此使用递归?循环遍历数组并将当前值与前一个值进行比较是一件简单的事情。不需要递归。 【参考方案1】:

这是一种简单的方法(无需递归):

void FindMinAndMaxValues(int[] array out int min, out int max)

    min = int.MaxValue,
    max = int.MinValue;

    foreach(var val in array)
    
        max = (val > max) ? val : max;
        min = (val < min) ? val : min;
    

请注意,我在这里使用了 out 参数。这样做是为了简化代码。通常,我更愿意返回指定的类或tuple。

此外,LINQ 具有您可以使用的 min 和 max 扩展方法 - 所以整个事情变成这样:

var max = array.Max();
var min = array.Min();

【讨论】:

以上是关于递归 - 堆栈溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

运行递归线性搜索时出现堆栈溢出错误

无限递归函数->堆栈溢出错误

递归过程中的第一个过程调用发生堆栈溢出

如何解决递归调用中的堆栈溢出错误?

由于递归方法调用导致 Java 堆栈溢出

用 C 语言编写一个程序,该程序使用递归来确定一个数字是不是为素数。大量出现堆栈溢出错误