繁体   English   中英

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

[英]Recursive function with stopping condition but without base case still works

我试图通过在不知道基本情况的情况下计算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 = %d\n", sumUpTo(num));
    return 0;
}

我发现这个 function 有停止条件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 ,正如您的评论所说, function 仍然可以工作,只是结果未确定。

  • 您没有设置 num 变量的基值,但它可以成功运行这是您的代码的特定情况。
  • 在此代码中,您使用了“for”语句如果传入的 num 为 0,则它不会通过“for”语句传递,因为 0 < 0 不正确。 这就是为什么它在最后一个最终循环中返回零的初始总和值
  • 参考安全算法,这是递归 function 的标准代码
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 循环,并且每次您的 function 重新启动(召回)时,它会将num的当前副本设置为 0..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM