我正在尝试递归重绘所有图像像素,但由于堆栈溢出而失败。但为什么呢?
void go( short x, short y ) {
if ( x < 0 || y < 0 || x >= _w || y >= _h ) return ;
_image[ x ][ y ] = someColor;
go( x + 1, y );
go( x - 1, y );
go( x, y - 1 );
go( x, y + 1 );
}
答案 0 :(得分:4)
此函数调用永远不会停止。
void go( short x, short y ) {
if ( x < 0 || y < 0 || x >= _w || y >= _h ) return ;
_image[ x ][ y ] = someColor;
go( x + 1, y );
go( x - 1, y );
go( x, y - 1 );
go( x, y + 1 );
}
如果您使用x=0,y=0
(go( 0, 0 );
)调用您的函数,则会执行此操作
_image[ 0 ][ 0 ] = someColor;
go( 1, 0 );
go( -1, 0 );
go( 0, -1 );
go( 0, 1 );
好了,现在让我们检查go( 1, 0 );
的函数调用:
_image[ 1 ][ 0 ] = someColor;
go( 2, 0 );
go( 0, 0 ); //ohoh
go( 1, -1 );
go( 1, 1 );
因此,您可以看到go( 0, 0 )
来电go( 1, 0 )
来电go( 0, 0 )
来电go( 1, 0 )
来电go( 0, 0 )
来电go( 1, 0 )
来电go( 0, 0 )
来电go( 1, 0 )
来电go( 0, 0 )
致电go( 1, 0 )
来电x
来电......
这就是你有堆栈溢出的原因。你永远不会离开。
为什么不创建2个循环并迭代这些循环?
由于您的示例总是将0
从_w
迭代到y
而0
从_h
迭代到void go( short x, short y ) {
for(short x = 0; x < _w; x++) {
for(short y = 0; y < _h; y++) {
_image[ x ][ y ] = someColor;
}
}
}
我会完全摆脱这些参数
你可以使用它:
SELECT u.id, u.name, ugi.images
FROM users u
JOIN user_gallery_images ugi on ugi.user_id = u.id
答案 1 :(得分:1)
我认为你错过了_image
数组初始值的一个基本情况,就是不要一遍又一遍地重新填充相同的值
if ( _image[x][y] != previousColor )
return;
答案 2 :(得分:1)
你永远不会结束递归。
例如,这两行
go( x + 1, y );
go( x - 1, y );
会相互呼叫。
可以使用每个单元格的标志来避免这种情况,该标志指示单元格是否已经重新绘制。
(或者您也可以使用迭代而不是递归)。