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

C++ 有没有办法在递归中使用指针来查找数组的最小值?,c++,pointers,recursion,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 arrSi

首先,我是一个初学者,所以如果这个问题看起来有点愚蠢,我提前道歉

我确实知道一种使用递归在下面这样的数组中找到最小值的方法

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) {
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;
}

有没有一个简单的方法可以做到这一点?我试着用标准的方法重新设计,但我似乎不知道如何用指针来实现这一点。

试试这样的方法:

const int *min(const int arr[], int arrSize) {
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;
}
const int*\u min(const int*arr,int arrSize)
{
如果(arrSize==1)
{
返回arr;
}
常数int*t=_min(arr+1,arrSize-1);
如果(*t<*arr)
{
返回t;
}
返回arr;
}

这里的关键是要理解
A
是一个指针。因此,如果您想返回指针而不是值,只需执行此操作。更改
返回一个[0]
返回A

您只需调整为返回指针而不是值,这意味着您不能使用
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);
}
const int*min\p(const int arr[],int arrSize){
如果(arrSize==1)
返回arr;
返回最小值(arr+(arr[arrSize-1]<*arr),arrSize-1);
}

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

好的,谢谢,这是一点帮助,但不幸的是仍然不能解决指针问题。您希望函数返回指针还是值?这接近我需要的!然而,我得到的编译器错误包括:从“const int*”到“int*”的转换无效。不幸的是,这不是尾部递归,因此即使编译器知道转换…最后一点没有意义-如果arrSize通常超出允许的值范围,它将导致UB,非负性就是一个例子。@SergeyA:原始的可以稍微扩展,所以如果
arrSize
不是正的,答案是
INT\u MIN
(这也导致了一个很好的迭代实现)
min_p()
可以扩展为返回
nullptr
,在这种情况下……虽然可以,但我不一定应该这样做。需要的有效范围可以简单地指定为合同。