我想知道是否可以在代码中使用这样的东西。 如果我有一段代码我想执行,那么在程序的许多部分都是一样的 它使用了这个版本的while循环,这会有用吗? (我知道我可以使用while循环,我只是认为这将是一个有趣的想法探索)
NSMutableArray *objects;
-(void) RemoveObjectLoop
{
[self RemoveObjectAtZero];
}
-(void) RemoveObjectAtZero
{
if([objects count] > 0)
{
[objects removeObjectAtIndex:0];
[self RemoveObjectLoop];
}
}
不要多次写出while循环,而是执行[self RemoveObjectLoop]。 这可以用于项目吗? 有没有你不想使用它的实例?
编辑:我知道这个例子很糟糕,我想不出别的什么。 如果可以的话,请在答案中加入一个例子。谢谢!
答案 0 :(得分:3)
这称为递归。在没有针对它进行优化的语言中,它仅适用于中等大小的集合,因为最终您将耗尽堆栈空间来保存函数所需的帧。它也比普通循环慢一点(再次,除非编译器优化它)。
对于某些算法,它非常适合。例如,深度优先搜索自然地实现为递归函数。不过,我认为这不是其中之一。
答案 1 :(得分:1)
在递归中,你通常不会有这样的循环函数调用。该功能只是在努力得出结论时自称。所以你的例子将成为:
-(void) RemoveAll
{
if([objects count] > 0)
{
[objects removeObjectAtIndex:0];
[self RemoveAll];
}
}
某些语言(如Logo)会自动优化尾递归(递归调用是函数的最后一行)。我从来没有听说过Objective-C那样做,如果有的话,我会感到惊讶。
通常(你的问题就是你所注意到的一个例子)递归例子是设计的,并且可以更好地非递归地解决。 Here are some real-world examples of recursion