c++ - 尝试递归地重新绘制所有图像像素

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

}

最佳答案

这个函数调用永远不会停止。

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 个循环并迭代这些循环? 正如您的示例始终将 x0 迭代到 _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;
        }
    }
}

关于c++ - 尝试递归地重新绘制所有图像像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41567553/

相关文章:

c++ - 通过 OpenGL Assimp 加载的对象有时会反转法线

c++ - 如何在 FITS 文件中的数组数据中表示像素?

linux - 在 Prolog 中测试包冲突

c++ - 分而治之算法返回大小为 n 的数组 int a[] 中偶数项的总和

java - 从已排序的双向链表创建二叉搜索树

c++ - 模板大小递归——构造函数多重重载

c++ - 模板成员转换运算符编译错误

c++ - 如何使用 c++11 语法创建 for 循环以遍历 vector

python - 递归打印数字金字塔

c++ - 如何根据用户输入创建模板对象?