我正在尝试以递归方式重新绘制所有图像像素,但由于堆栈溢出而失败。但是为什么?
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 );
}
最佳答案
这个函数调用永远不会停止。
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 )
调用 .. ..
这就是堆栈溢出的原因。你永远出不去。
为什么不创建 2 个循环并迭代这些循环?
正如您的示例始终将 x
从 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;
}
}
}
关于c++ - 尝试递归地重新绘制所有图像像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41567553/