如何将Lua中的递归函数转换为C

如何将Lua中的递归函数转换为C,c,lua,side-effects,C,Lua,Side Effects,在学习C编程的过程中,我试图将一些Lua代码翻译成C。我知道C与Lua不一样,被认为是一种“函数”语言,但我想知道如何/如果可能的话。 Lua代码: function Increment(a) a = a + 1 if a == 100 then return 0 else return Increment(a) end end 在这段代码中,Lua巧妙地在再次调用函数后退出该函数,以避免创建大量嵌套函数 在C语言中,有没有一种递归方法可以在再次调用函数之前退出函数,以避免形成一大组嵌套函数

在学习C编程的过程中,我试图将一些Lua代码翻译成C。我知道C与Lua不一样,被认为是一种“函数”语言,但我想知道如何/如果可能的话。 Lua代码:

function Increment(a)
a = a + 1
if a == 100 then return 0
else return Increment(a) end end
在这段代码中,Lua巧妙地在再次调用函数后退出该函数,以避免创建大量嵌套函数

在C语言中,有没有一种递归方法可以在再次调用函数之前退出函数,以避免形成一大组嵌套函数


我理解功能可以以这种方式使用,以避免副作用;如何用C编写此代码来避免它们呢?

如果您想要一个全局代码,请尝试此代码,但会有副作用:

int a;

int increment()
{
    a = a + 1;
    if (a == 100)
        return 0;
    else
        return increment();
}
如果您不想产生副作用,并且此解决方案不堆叠许多函数,则更愿意使用,因为您在最后一条语句中调用了您的函数

int increment(int a)
{
  if (a == 100)
     return a;
  else
     return increment(a + 1);
}
例如,这是一个创建函数堆栈的示例:

    int increment(int a)
    {
      if (a == 100)
         return a;
      else
      {
         a = increment(a);
         return (a + 1);
      }
   }

正如Shar在上面指出的,lua代码到C的直接翻译是:

int increment(int a)
{
  if (a == 100)
     return a;
  else
     return increment(a + 1);
}
对于高达100的情况,堆栈使用不会成为问题,除非您使用的是非常小的嵌入式系统。然而,在C语言中,并不能保证C编译器会进行尾部调用优化(正如您所说的,“Lua在再次调用函数后巧妙地退出该函数,以避免创建大量嵌套函数”)

对于这样一个简单的例子,许多编译器实际上都会进行尾部调用优化,但是如果(a==100000000)使用
if
并依赖它,这是一个坏主意。如果您这样做,您可能会有一个程序在“发布”优化版本中工作,但在“调试”版本中崩溃

因此,如果您知道会有很多递归,您可以自己进行优化:

int increment(int a)
{
  for(;;)
  {
    if(a == 100)
      return a;
    else
      a = a + 1;
  }
}
// and then "clean it up":
int increment(int a)
{
  while (a != 100)
  {
    a = a + 1;
  }
  return a;
}

您需要使用
a==10
而不是
a=10
。您的意思是Lua进行尾部调用,而C不进行尾部调用吗?@lhf进行了更改,谢谢您的注释。我编辑了我的代码,以便使用全局函数执行此操作,但我认为这在C中不是一个好的做法,请小心。@etothepowerprofx,Lua中的函数参数是一个局部变量,与C中的函数参数相同。@lhf我看到了。这就是为什么声称函数消除了副作用,因为函数运行时实际值保持不变?在我的示例中,你有副作用,因为你做了“a=a+1”。我的第一个解决方案,返回增量(a+1);没有副作用。(我认为你的lua代码有副作用)。@Shar谢谢你的帮助!一个非常简单的例子,我很感激。