为什么我的recursiveMinimum函数不起作用?

时间:2009-12-18 14:29:06

标签: c++ recursion

#include <iostream>
using namespace std;

int recursiveMinimum(int [], int n);

int main () 
{
    int theArray[3] = {1,2,3};

    cout << recursiveMinimum(theArray, 0);
    cout << endl;
    return 0;
}


// pass in array and 0 to indicate first element
// returns smallest number in an array
int recursiveMinimum (int anArray[], int n) // nth element is smallest element in anArray
{
    while (anArray[n+1] != NULL)
    {
        int smallest = n;
        if (anArray[n+1] <= anArray[n])
            smallest = n + 1;
        //if last element has not been reached
        return recursiveMinimum(anArray, smallest);
    }
}

我的功能退出,但它不会返回任何内容。我试图将基本情况设置为到达数组外部的时间。在main中返回0行,所以我很确定我的函数中的基本情况正在到达。

这是工作职能:

#include <iostream>
using namespace std;

 int recursiveMinimum(int a[],int min,int index,int size);

int main()
{
    int a[6] = {8, 2, 55, 3, 11, 9};
    cout << recursiveMinimum(a,a[0],1,6) << endl;
    return 0;
}

// pass in the array, the first element, 
// 1 to indicate 2nd element, and the number of elements
int recursiveMinimum(int a[],int min,int i,int size)
{
    if(i == size )
       return min;

    else if(i < size)
    {
       if(a[i] < min)    
          recursiveMinimum(a,a[i], i + 1, size);
       else 
          recursiveMinimum(a,min, i + 1, size);      
    }

}

感谢所有帮助过的人。由于时间限制,我发出了一个SOS(Stack Overflow 遇险信号),但是下次在提问之前我肯定会逐步完成调试。

8 个答案:

答案 0 :(得分:4)

您是否在调试器中完成了此操作?当你这样做时,它应该变得相当明显。

答案 1 :(得分:3)

你在while循环中递归:

while(条件) 递归调用 而(条件) 递归调用 。 。

相反,你可能在想的是

if(condition) 递归调用 递归调用 递归调用

你知道吗?摆脱时间并用“if”语句替换它。

答案 2 :(得分:2)

你需要一个带有递归函数的结束案例。

目前,您的功能总是自行返回。这将递归,直到堆栈用完。你需要有一个“我已经完成”的检查,它将返回一个值,而不是另一个函数调用的结果。

答案 3 :(得分:1)

因为你的while循环永远不会终止。为什么你确定anArray[n+1]将是NULL?

答案 4 :(得分:1)

你永远不会破坏你的递归。实际上我想知道这会编译,因为你的函数甚至没有定义的返回值,以防它到达终点。同样使用while似乎没有必要,因为函数执行在返回之后仍然停止。

答案 5 :(得分:1)

而不是

int recursiveMinimum(int array[], int n);

我认为recursiveMinimum应定义为

int recursiveMinimum(int array[], int index, int length);

意图recursiveMinimum将在arrayindex之间的length返回最小值(即min array[i] i[index, length))。当然,您希望以递归方式定义它。那么我会注意到索引arrayindex之间length的最小值是

min(array[index], recursiveMinimum(array, index + 1, length));

当然,有边界情况(例如index = length - 1时)。在这种情况下,您只需将array[index]作为最小值。

希望这会有所帮助。如果这没有意义,请告诉我。

答案 6 :(得分:1)

 int recursiveMinimum(int a[],int min,int index,int size)
{
    if(index == size )
       return min;

    else if(i < size)
    {
       if(a[i] < min)    
          recursiveMinimum(a,a[i],++index,size);
       else 
          recursiveMinimum(a,min,++index,size);      
    } 

}

int main()
{
    int a[] = {1,2,3,0,-4};
    int min = recursiveMinimum(a,a[0],1,5));
    return 0;
}

当你使用递归时,确保你必须设置一些退出条件来结束它,否则你将进行无限递归,你的程序将会挂起。

我认为使用迭代而不是递归来查找最小值更有效,简单和简单。

答案 7 :(得分:1)

你误解了递归函数的要点。如果某个条件为真,则将调用结果返回给递归函数,否则返回其他值。例如,这里是阶乘函数的递归定义(例如5!或“5阶乘”,是5*4*3*2*1,即125):

int
factorial (int n)
{
  if (n == 1)
    return n;
  return (n * factorial (n - 1));
}

工作原理:

  • 如果n为1,则返回1,因为1!为1。

  • 否则,返回n乘以小于n的一个。

例如,如果n为5,则返回值是表达式5 * factorial (5 - 1)的结果,与5 * factorial (4)相同。当然,同样的事情再次发生,因为它是一个递归函数而4不是1.所以最终得到5 * factorial (4),这与5 * (4 * factorial (4 - 1))5 * (4 * factorial (3))相同。

您现在应该可以看到模式以及阶乘函数的工作原理。你的recursiveMinimum函数应该遵循相同的一般想法 - 如果某些事情是真的(或不是真的),则返回调用函数的函数(可能还有一些额外的东西,比如factorial函数中的值n需要乘以阶乘函数的结果),否则返回一个值并编码函数来适当地处理它。换句话说,您需要一个“最终”退出条件,例如上面的阶乘函数中的n == 1条件。

祝你好运!