有没有办法在递归中使用指针来查找数组的最小值?

时间:2018-05-29 20:02:35

标签: c++ pointers recursion

首先,我是初学编码员,所以如果这个问题看起来有点笨,我会提前道歉。

我知道一种使用递归来查找数组中最小值的方法,如下所示。

int findMinRec(int A[], int n)
{
    if (n == 1)
        return A[0];
    return min(A[n-1], findMinRec(A, n-1));
}

但是,我试图找出一个使用递归和指针的方法。像这样:

const int *min(const int arr[], int arrSize) {

有没有一种简单的方法可以做到这一点?我尝试重新设计标准方式,但我似乎无法弄清楚如何用指针来做这件事。

3 个答案:

答案 0 :(得分:2)

您只需调整为返回指针而不是值,这意味着您无法使用std::min()。内联展开并进行调整。
我还重命名了你的函数,使它明显地返回一个指向最小元素的指针,而不是std::min()的受限重新实现。
另一个重点是使其尾递归,因此编译器可以轻松地将其优化为迭代并省略添加堆栈帧。

const int *min_p(const int arr[], int arrSize) {
    if (arrSize == 1)
        return arr;
    return min_p(arr + (arr[arrSize - 1] < *arr), arrSize - 1);
}

同样有趣的是,如果min_p()不是正面的话,您的原始代码和arrSize都会导致UB ...

答案 1 :(得分:1)

尝试这样的事情:

const int *_min(const int *arr, int arrSize)
{
    if (arrSize == 1)
    {
        return arr;
    }
    const int *t = _min(arr + 1, arrSize - 1);
    if (*t < *arr)
    {
        return t;
    }
    return arr;
}

答案 2 :(得分:0)

这里的关键是要了解A 指针。因此,如果您想返回指针而不是值,请执行此操作。将return A[0];更改为return A;