阵列中最大的双倍

时间:2016-05-16 05:35:20

标签: c++ arrays recursion

我正在尝试使用递归返回数组中最大的double。

sz是数组中元素的数量。

start是开始当前调用的数组的索引。

这是我到目前为止所拥有的。为什么函数在命中'return max'行时不会终止!?

double arrayMax (double arr[], int sz, int start) {
double max;

if (start == sz) {
    return max;
} else {
    if (arr[start] > max) {
        max = arr[start];
    }
    arrayMax(arr, sz, start+1);
}
return max;

}

5 个答案:

答案 0 :(得分:2)

首先,您的第二行中没有指定的最大值。哪会引起问题。因为如果大小和起始整数值相同,你试图返回它 - 我相信当数组中只有一个元素时会发生这种情况。

所以你要说的是,如果我的数组只有一个元素,则返回一个名为max的值,但是没有人知道它里面的值是什么。 (未定义的行为)

然而,这也是错误的。因为如你所见,我们正在为max变量赋值,但由于我们在所有调用中定义并声明它,这导致我们使用大量内存。所以更好的方法是你需要将你的最大变量及其值作为参数赋予你的函数,这是更好的方法。

其次,返回递归函数会更好。因为您在递归调用中没有返回。你需要在两个地方都这样做。

首先,你需要在你的所有函数结束时返回你的最大值,然后你需要返回你的函数,在你的函数结束的上一级进行另一次递归调用。

此代码与幽灵一样,所以我和他在一起。

double arrayMax (double maxValue, double myArray[], int arraySize, int startPoint) 
{
    if (startPoint < arraySize) 
    {
        if (myArray[startPoint] > maxValue)
            maxValue = myArray[startPoint];

        return arrayMax(maxValue, myArray, arraySize, startPoint + 1);
    }
    return maxValue;
}

答案 1 :(得分:1)

已发布代码的问题:

  1. 递归逻辑存在缺陷。实现函数的方式,每次调用函数都会创建一个新的局部变量max。最大值不会通过递归调用传播。

  2. max正在使用而未初始化。这导致了不确定的行为。

  3. 递归电话中没有return

  4. 我建议在辅助函数中实现核心逻辑。

    double arrayMaxHelper(double arr[], int sz, int start, int currentMax)
    {
       if (start == sz)
       {
          return currentMax;
       }
    
       if (arr[start] > currentMax)
       {
          currentMax = arr[start];
       }
    
       return arrayMaxHelper(arr, sz, start+1, currentMax);
    }
    
    double arrayMax (double arr[], int sz, int start)
    {
       // Call the helper function.
       // The fact that arrayMax is implemented using a recursive
       // helper function is a detail. Callers of the arrayMax()
       // shouldn't have to worry about it.
       return arrayMaxHelper(arr, sz, start, std::numeric_limits<double>::min):
    }
    

答案 2 :(得分:0)

double arrayMax (double max, double arr[], int sz, int start) {

if (start < sz) {

    if (arr[start] > max) {
        max = arr[start];
    }

    return arrayMax(max, arr, sz, start+1);
}

return max;

}

如果数组长度未确定或非常大,则表示非常错误的方式。使用迭代算法,命令式语言可以更好地工作。

答案 3 :(得分:0)

在递归调用中,您递增start,但不递减sz。因此,算法的待办事项列表不会变短。

答案 4 :(得分:0)

这是怎么回事:

double arrayMax (double arr[], int sz, int start)
{
    double max;
    if(start >= sz - 1)
    {
        max = arr[sz - 1];
    }
    else
    {
        max = arrayMax (arr, sz, start + 1);
        if(arr[start] > max)
        {
            max = arr[start];
        }
    }
    return max;
}

没有其他参数,没有帮助函数......