2011-12-03 79 views
0

我想知道是否可以在代码中使用这样的东西。 如果我想要执行的程序代码块在 程序的许多部分都是相同的,并且它使用此版本的while循环,这是否可行? (我知道我可以用一个while循环,我只是认为这将是一个有趣的想法,探索)while循环与函数?

NSMutableArray *objects; 
-(void) RemoveObjectLoop 
{ 
    [self RemoveObjectAtZero]; 
} 

-(void) RemoveObjectAtZero 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveObjectLoop]; 
    } 
} 

而不是写了一个while循环多次,只是做[自RemoveObjectLoop。 这可以为一个项目工作吗? 有没有你不想使用它的实例?

编辑:我知道这个例子不好,我只是想不出别的。 如果可以的话,请在答案中加入一个例子。谢谢!

+1

使用[yourObject removeAllObjects]; – Aravindhan

+1

我知道这不是一个实际的例子,它实际上是可怕的。请回答实际问题,谢谢! :D – Telinir

+0

此外,而不是yourObject你不会把[yourArray removeAllObjects]? :P – Telinir

回答

1

在递归中,你通常不会有这样的循环函数调用。该功能只会在结论时自称。所以,你的例子将成为:

-(void) RemoveAll 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveAll]; 
    } 
} 

有些语言(如标志)会自动优化尾递归(其中递归调用该函数的最后一行)。我从来没有听说过Objective-C这样做,如果确实如此,我会感到惊讶。

通常(你的问题是一个你已经注意到的例子)递归的例子是人为设计的,并且可以非递归地解决。 Here are some real-world examples of recursion

+0

感谢您解释它并举例说明! – Telinir

+1

不客气。根据您所做的编程类型,您可以花费数年的时间而不需要使用递归,但是现在偶尔它是一种解决问题的几乎神奇优雅的方式,所以在您的工具箱中拥有一件好东西。 – SSteve

3

这被称为递归。在不为其优化的语言中,它仅适用于中等大小的集合,因为最终将耗尽堆栈空间以容纳函数所需的帧。它也比普通循环稍慢(再次,除非编译器优化它)。

对于一些算法,这是一个很好的选择。例如,深度优先搜索自然被实现为递归函数。不过,我认为这不是其中之一。

+0

谢谢查克!我知道这个例子很糟糕,对不起:D – Telinir