【问题标题】:While loop with functions?带函数的while循环?
【发布时间】:2012-01-12 01:25:08
【问题描述】:

我想知道这样的东西是否可以在代码中使用。 如果我有一段我想执行的代码,在程序的许多部分都是一样的 它使用了这个版本的while循环,这行得通吗? (我知道我可以使用 while 循环,我只是认为这是一个值得探索的有趣想法)

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

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

只需执行 [self RemoveObjectLoop] 即可,而不是多次写出 while 循环。 这可以为一个项目工作吗? 有没有你不想使用它的实例?

编辑:我知道这个例子很糟糕,我只是想不出别的。 如果可以,请在您的答案中包含一个示例。谢谢!

【问题讨论】:

  • 使用 [yourObject removeAllObjects];
  • 我知道这不是一个实际的例子,它实际上很可怕。请回答实际问题,谢谢! :D
  • 另外,你不会放 [yourArray removeAllObjects] 而不是 yourObject 吗? :P

标签: iphone objective-c xcode loops


【解决方案1】:

这称为递归。在没有针对它进行优化的语言中,它仅可用于中等大小的集合,因为最终您将耗尽堆栈空间来保存函数所需的帧。它也比普通循环慢一些(同样,除非编译器对其进行优化)。

对于某些算法,它非常适合。例如,深度优先搜索自然地实现为递归函数。不过,我不认为这是其中一种情况。

【讨论】:

  • 谢谢查克!我知道这个例子很糟糕,对不起:D
【解决方案2】:

在递归中,您通常不会有这样的循环函数调用。该函数只会在得出结论时调用自己。所以你的例子会变成:

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

某些语言(如 Logo)会自动优化尾递归(递归调用是函数的最后一行)。我从未听说过 Objective-C 会这样做,如果是这样,我会感到惊讶。

通常(正如您所指出的那样,您的问题就是一个恰当的例子)递归示例是人为的,最好以非递归方式解决。 Here are some real-world examples of recursion.

【讨论】:

  • 感谢您的解释并提供示例!
  • 不客气。根据您正在执行的编程类型,您可以持续数年而不需要使用递归,但它时不时地是一种几乎神奇而优雅的解决问题的方法,因此在您的工具箱中拥有它是一件好事。跨度>
猜你喜欢
  • 2021-12-03
  • 2021-01-14
  • 1970-01-01
  • 2018-12-06
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多