C++ 为什么递归最小函数不起作用? #包括 使用名称空间std; int递归最小值(int[],int n); int main() { 数组[3]={1,2,3}; cout
您需要一个带有递归函数的结束案例C++ 为什么递归最小函数不起作用? #包括 使用名称空间std; int递归最小值(int[],int n); int main() { 数组[3]={1,2,3}; cout,c++,recursion,C++,Recursion,您需要一个带有递归函数的结束案例 此时,您的函数总是返回自身。这将递归直到堆栈耗尽。您需要有一个显示“我完成了”的检查,该检查将返回一个值,而不是另一个函数调用的结果。您需要有一个递归函数的结束案例 此时,您的函数总是返回自身。这将递归直到堆栈耗尽。您需要有一个显示“我完成了”的检查,该检查将返回一个值,而不是另一个函数调用的结果。因为您的while循环从未终止。为什么您确定anArray[n+1]将永远为空?因为您的while循环从未终止。为什么您确定anArray[n+1]是否会为空?您从未
此时,您的函数总是返回自身。这将递归直到堆栈耗尽。您需要有一个显示“我完成了”的检查,该检查将返回一个值,而不是另一个函数调用的结果。您需要有一个递归函数的结束案例
此时,您的函数总是返回自身。这将递归直到堆栈耗尽。您需要有一个显示“我完成了”的检查,该检查将返回一个值,而不是另一个函数调用的结果。因为您的while循环从未终止。为什么您确定
anArray[n+1]
将永远为空?因为您的while循环从未终止。为什么您确定anArray[n+1]
是否会为空?您从未中断过递归。事实上,我想知道这是否会编译,因为您的函数在到达结尾时甚至没有定义的返回值。另外,在使用时,
似乎没有必要,因为函数执行在返回之后停止。您从未中断过递归。实际上,我当函数到达末尾时,它甚至没有定义的返回值进行编译。同时使用,
似乎没有必要,因为函数在返回后停止执行。您是否在调试器中完成了此操作?当您完成此操作时,它应该变得相当明显。您完成了吗这在调试器中?当您这样做时,它应该变得相当明显。您正在while循环中递归:
while(条件)
递归调用
while(条件)
递归调用
.
.
相反,你可能认为
如果(条件)
递归调用
递归调用
递归调用
看到了吗?去掉while并用“if”语句替换它。您在while循环中递归: while(条件) 递归调用 while(条件) 递归调用 . . 相反,你可能认为 如果(条件) 递归调用 递归调用 递归调用 看到了吗?去掉while,用“if”语句代替它。而不是
#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);
}
}
我认为递归最小值应定义为
int recursiveMinimum(int array[], int n);
意图是recursiveMinimum
将返回index
和length
之间的array
中的最小值(即minarray[i]
其中i
在[索引,长度]中)
)。当然,您希望递归地定义它。因此,我要注意,索引索引和长度之间的数组中的最小值是
int recursiveMinimum(int array[], int index, int length);
当然,也存在边界情况(例如index=length-1
),在这种情况下,您只需返回array[index]
作为最小值
希望这能有所帮助。如果没有意义,请告诉我。而不是
#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);
}
}
min(array[index], recursiveMinimum(array, index + 1, length));
我认为递归最小值应定义为
int recursiveMinimum(int array[], int n);
意图是recursiveMinimum
将返回index
和length
之间的array
中的最小值(即minarray[i]
其中i
在[索引,长度]中)
)。当然,您希望递归地定义它。因此,我要注意,索引索引和长度之间的数组中的最小值是
int recursiveMinimum(int array[], int index, int length);
当然,也存在边界情况(例如index=length-1
),在这种情况下,您只需返回array[index]
作为最小值
希望这有帮助。如果这不合理,请告诉我
min(array[index], recursiveMinimum(array, index + 1, length));
当您使用递归时,请确保您必须设置一些退出条件来结束它,否则您将陷入无限递归,并且您的程序将挂起
我认为使用迭代而不是递归来寻找最小值更有效、更容易、更简单
当您使用递归时,请确保您必须设置一些退出条件来结束它,否则您将陷入无限递归,并且您的程序将挂起
我认为使用迭代而不是递归查找最小值更有效、更简单。您误解了递归函数的意义。如果某个条件为真,则返回调用递归函数的结果,否则返回其他值。例如,以下是阶乘函数(例如5!
,或“5阶乘”是5*4*3*2*1
,即125):
工作原理:
- 如果
n
为1,则返回1,因为1!
为1
- 否则,返回
n
乘以小于n
的一
例如,如果n
为5,则返回值是表达式5*阶乘(5-1)
的结果,这与5*阶乘(4)
相同。当然,同样的情况再次发生,因为它是递归函数,而4不是1。因此,最终得到5*阶乘(4)
,与5*(4*阶乘(4-1))
或5*(4*阶乘(3))
相同
您现在应该能够看到模式以及阶乘函数是如何工作的。您的recursiveMinimum函数应该遵循相同的一般思想——如果某个值为真(或非真),则返回调用该函数的结果(可能需要将阶乘函数中的值n
与阶乘函数的结果相乘),否则返回某个值并对函数进行编码以正确处理。换句话说,您需要一个“final”退出条件,例如阶乘函数abov中的n==1
条件