我应该避免使用在 iPhone 上运行的代码进行递归吗?
或者换一种说法,有人知道 iphone 上的最大堆栈大小吗?
是的,避免递归在所有嵌入式平台上都是一件好事。
它不仅降低甚至消除了堆栈溢出的可能性,而且通常还可以为您提供更快的代码。
您始终可以将递归算法重写为迭代。不过,这并不总是实用的(想想快速排序)。解决此问题的一种方法是以限制递归深度的方式重写算法。
introsort 是一个很好的例子,它是如何在实践中完成的。它将快速排序的递归深度限制为 log2(元素数)。所以在 32 位机器上你永远不会递归超过 32。
http://en.wikipedia.org/wiki/Introsort
过去我为嵌入式平台(汽车娱乐系统、电话、游戏机等)编写了相当多的软件,并且我总是确保我在递归深度上设置了一个上限或一开始就避免递归地方。
结果,我的任何程序都没有因堆栈溢出而死,大多数程序都对 32kb 的堆栈感到满意。一旦您需要多个线程,这会带来很大的回报,因为每个线程都有自己的堆栈。您可以通过这种方式节省数兆字节的内存。
我看到几个答案归结为“不要使用递归”。我不同意——它不像 iPhone 是一些受到严格限制的嵌入式系统。如果问题本质上是递归的,请随意以这种方式表达。
除非您递归到数百或数千帧的堆栈深度,否则您永远不会遇到问题。
iphone上的最大堆栈大小?
iPhone 运行经过修改的 OSX,其中每个进程都被赋予一个有效的内存空间,就像在大多数操作系统中一样。
它是一个完整的处理器,因此堆栈会增大,而堆会减小(反之亦然,具体取决于您的观点)。这意味着在分配给程序的内存用完之前,您不会溢出堆栈。
出于堆栈和性能原因,最好尽可能避免递归(函数调用相对于简单循环而言代价高昂),但无论如何,您应该决定可以对递归函数施加什么限制,如果它们太长,就截断它们。