3

为了学习 C 编程,我正在尝试将一些 Lua 代码翻译成 C。我知道 C 不被视为与 Lua 相同的“功能”语言,但我想知道如何/是否可能。卢阿代码:

function Increment(a)
a = a + 1
if a == 100 then return 0
else return Increment(a) end end

在这段代码中,Lua 巧妙地在再次调用该函数后退出该函数,以避免创建大量嵌套函数。

在 C 中是否有一种用于在再次调用函数之前退出函数的递归方法,以避免形成一大群嵌套函数?

我知道可以以这种方式使用函数来避免副作用;我怎样才能用 C 写这个来避免它们呢?

4

2 回答 2

3

如果你想要一个全局的,试试这个代码,但有副作用:

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);
      }
   }
于 2013-06-25T13:33:00.557 回答
2

正如 Shar 上面所指出的,将 lua 代码直接翻译为 C 是:

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

对于高达 100,堆栈使用不会成为问题,除非您使用的是非常小的嵌入式系统。但是,在 C 中不能保证 C 编译器会进行尾调用优化(正如您所说,“Lua 在再次调用该函数后巧妙地退出该函数以避免创建大量嵌套函数”) .

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

所以,如果你知道会有很多递归,你可以自己做优化:

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;
}
于 2013-06-28T12:39:02.123 回答