尝试递归重绘所有图像像素

时间:2017-01-10 11:19:12

标签: c++ recursion

我正在尝试递归重绘所有图像像素,但由于堆栈溢出而失败。但为什么呢?

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 ); 

}

3 个答案:

答案 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=0go( 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迭代到y0_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 );

会相互呼叫。

可以使用每个单元格的标志来避免这种情况,该标志指示单元格是否已经重新绘制。

(或者您也可以使用迭代而不是递归)。