c++ - 这是递归上下文中的编译器优化吗?

标签 c++ c recursion tail-recursion factorial

我正在使用尾递归编写阶乘,我在这里有一个问题。我原来的功能是这样的

代码片段A

#include <stdio.h>

int main(void)
{
 int n = 0;

 printf("Enter number to find factorial of : ");
 scanf("%d",&n);

 printf("fact == %d\n",fun(n,1));

 return 0;
}

int fun(int n, int sofar)
{
 int ret = 0;

 if(n == 0)
  return sofar;

 ret = fun(n-1,sofar*n);

 return ret;
}

但是,即使我不使用 return,它仍然有效。这并不完全合理,因为我只在基本情况下返回值。假设 n==5,则在基本情况下将返回 120。但是无法预测从第 4 次调用返回到第 3 次调用的内容,因为我们没有明确指定任何返回,这与代码片段 A 不同。

代码片段B

int fun(int n, int sofar)
{
 int ret = 0;

 if(n == 0)
  return sofar;

 ret = fun(n-1,sofar*n);
}

我认为上述工作是因为某种编译器优化?因为如果我在代码片段 B 中添加一个 printf 语句,它就不再起作用了。

代码片段C

 int fun(int n, int sofar)
    {
     int ret = 0;

     if(n == 0)
      return sofar;

     ret = fun(n-1,sofar*n);

     printf("now it should not work\n");
    }

可能是 printf 导致从堆栈中删除某些内容?请帮助我理解这一点。

最佳答案

不从应该返回值的函数返回值是 undefined behavior .

如果运气好的话,那么这不是优化,而只是这些自动分配值的存储方式和存储位置的巧合。

关于c++ - 这是递归上下文中的编译器优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189662/

相关文章:

c++ - 将二维数组传递给函数时出错

c++ - 在多线程环境中管理 sqlite 数据库

c - Fwrite 不会复制二进制文件副本中的所有字节

c++ - 使用 C++ 模板函数递归编译时间

java - 8 皇后算法 : Not getting full result set

C++ - 将数据从 float vector 复制到 uint8 vector ?

c++ - vc6和vc7中的CString有什么区别?

java - 环境->查找类 ("java.lang.Math");

C:不会创建.eh_frame_hdr表

c# - 在 C# 中,在算法中使用递归函数是一种好习惯吗?