【发布时间】:2015-10-27 16:42:21
【问题描述】:
我在 bmp 中有以下用于“blob 填充”的代码。但是,它在循环 7201 或类似的地方耗尽了堆栈上的内存。如何增加内存?我听说堆栈大小是 1MB,这太小了!我有 32GB 内存,我想充分利用它。如果我的堆栈不是太微不足道,递归似乎就是这样的算法。 (这是一种四向递归;每个函数调用都会产生四个相同的函数调用)
public HashSet<int> evalpxls = new HashSet<int>();
public String addLikePixels(int r, int c, Byte A, Byte R, Byte G, Byte B, Bitmap bmp)
{
reclvl++;
dl("Try r:" + r+ " c:" + c + " reclvl:"+reclvl);
if (evalpxls.Contains(hash(r,c)) || r>=bmp.Height || c>=bmp.Width || r<0 || c<0) return "";
evalpxls.Add(hash(r, c));
var p = bmp.GetPixel(c, r);
String curpix = "[" + r + "," + c +"]";
if (p.A == A && p.B == B && p.G == G && p.R == R) //if same color as main color
{
return curpix + addLikePixels(r + 1, c, A, R, G, B, bmp) + addLikePixels(r, c + 1, A, R, G, B, bmp) + addLikePixels(r - 1, c, A, R, G, B, bmp) + addLikePixels(r, c - 1, A, R, G, B, bmp);
}
else //if different color
return "";
}
【问题讨论】:
-
转换为迭代解决方案可能比使用庞大的堆栈更好
-
您可能还想看看Eric Lippert 的answer,他很好地解释了您的所有选择。
-
关于转换为迭代解决方案的任何想法?似乎无法立即想到该解决方案的迭代模拟,除非采用完全不同的方法(我没有提出任何 ATM)。
-
想出了一个使用堆栈和while循环的解决方案。而(!locations.empty)locations.pop。如果相同的颜色-> 位置。推(上、下、左、右)等;仍然很优雅,但递归确实具有“直观”的美感。
标签: c# recursion stack-overflow