#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 遇险信号),但是下次在提问之前我肯定会逐步完成调试。
答案 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
将在array
和index
之间的length
返回最小值(即min array[i]
i
在[index, length)
)。当然,您希望以递归方式定义它。那么我会注意到索引array
和index
之间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
条件。