我应该避免在iPhone上递归吗?

时间:2009-03-27 03:57:02

标签: iphone recursion stack tail-recursion

我应该避免使用在iPhone上运行的代码进行递归吗?

换句话说,有人知道iPhone上的最大堆栈大小吗?

3 个答案:

答案 0 :(得分:3)

是的,避免递归对所有嵌入式平台都是好事。

它不仅可以降低甚至消除堆栈溢出的可能性,还可以为您提供更快的代码。

您始终可以重写递归算法以进行迭代。虽然这并不总是实用的(想想快速排序)。解决这个问题的方法是以递归深度有限的方式重写算法。

内省是一个完美的例子,它是如何在实践中完成的。它将快速排序的递归深度限制为log2(元素数)。因此,在32位机器上,你永远不会超过32。

http://en.wikipedia.org/wiki/Introsort

我过去曾为嵌入式平台编写过相当多的软件(汽车娱乐系统,手机,游戏机等),我总是确保在递归深度上设置上限或避免递归在第一位。

因此,我的程序都没有因堆栈溢出而死亡,大多数程序都满意32kb的堆栈。一旦你需要多个线程,每个线程获得它自己的堆栈,这就可以节省大量时间。你可以通过这种方式节省数兆字节的内存。

答案 1 :(得分:2)

我看到了一些归结为“不使用递归”的答案。我不同意 - 它不像iPhone是一些严格受限的嵌入式系统。如果问题本质上是递归的,请随意表达。

除非你递归到数百或数千帧的堆栈深度,否则你永远不会有问题。

答案 2 :(得分:1)

iphone上的最大堆栈大小?

iPhone运行一个经过修改的OSX,其中每个进程都有一个有效的内存空间,就像在大多数操作系统中一样。

它是一个完整的处理器,因此堆栈会增长,堆也会增长(反之亦然,具体取决于您的观点)。这意味着在分配给程序的内存不足之前,不会溢出堆栈。

当你可以出于堆栈和性能原因(函数调用相对于简单的循环而言是昂贵的)时,最好避免递归,但无论如何你应该决定你对递归函数有什么限制,如果它们去了就截断它们太久了。