为了学习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语言写这个来避免它们呢?
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
正如Shar上面所指出的,将lua代码直接转换为C是:
int increment(int a)
{
if (a == 100)
return a;
else
return increment(a + 1);
}
为了达到100,除非你在一个非常小的嵌入式系统上,否则堆栈的使用不会成为问题。但是,在C中不能保证C编译器会执行尾部调用优化(正如你所说的那样,“Lua在再次调用它之后巧妙地退出函数以避免创建一个巨大的嵌套函数堆栈“)。
对于像这样的简单示例,许多编译器实际上会进行尾调用优化,但使用if(a == 1000000000)
并依赖它是一个坏主意。如果你这样做,你可能会有一个程序在“Release”优化版本中工作,但在“Debug”版本中崩溃。
所以,如果你知道会有很多递归,你可以自己做优化:
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;
}