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
条件