具有停止条件但没有基本情况的递归函数仍然有效



我试图在不了解基本情况的情况下通过计算sumn来解决这个问题,并提出了这个问题。它有效,但我不知道为什么。

int sumUpTo(int num)
{
int i, sum = 0;      // I also tried not to initialize sum here but the results are the same
for(i = 0; i < num; i++)
sum = sumUpTo(num - 1) + num;
return sum;
}
int main()
{
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("Sum = %dn", sumUpTo(num));
return 0;
}

我发现这个函数有停止条件i=num,但没有基本情况,循环将以sum = sumUpTo(0) + 1 + ... + num停止。在不知道sumUpTo(0)的值的情况下,程序如何工作?这里可能会发生什么?程序是否假设sumUpTo(0)的值为0(即使有/没有初始化变量sum(?

假设您输入3作为输入。

for(i = 0; i < 3; i++)   // Returns 3 + 3 = 6
for(i = 0; i < 2; i++)   // Returns 2 + 1 = 3
for(i = 0; i < 1; i++)   // Returns 1 + 0 = 1
for(i = 0; i < 0; i++) // Returns 0

这里递归将结束,因为它不会调用另一个实例

如果您没有初始化sum,正如您的评论所说,该函数仍然可以工作,只是结果尚未确定。

  • 您没有设置num变量的基值,但它成功地工作了这是您的代码的具体情况
  • 在此代码中,您使用了"for"语句如果传入的num为0,则它不会通过"for"语句传递,因为0<0不是真的。这就是为什么它在最后一个循环中返回零的初始和值
  • 安全算法参考,这是递归函数的标准代码
int sumUpTo(int num)
{
if(num == 0)
return 0;
return sumUpTo(num - 1) + num;
}

它的工作原理就像在for循环中有一样

for(i = 0; i < num; i++)

如果num为0或更低,则for循环将永远不会执行,并且由于您有

int sum = 0;

它将返回0,因为它从未进入for循环,每次重新启动(调用(函数时,它都会将num的当前副本更改为0.

最新更新