Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 为什么递归WebGL函数不会导致堆栈溢出?_Recursion_Webgl_Stack Overflow - Fatal编程技术网

Recursion 为什么递归WebGL函数不会导致堆栈溢出?

Recursion 为什么递归WebGL函数不会导致堆栈溢出?,recursion,webgl,stack-overflow,Recursion,Webgl,Stack Overflow,这是我关于StackOverflow的第一个问题,请原谅协议中的任何违规行为 我在大学的计算机图形学课上学习WebGL。在学习在屏幕上旋转正方形时,我和同学们注意到渲染函数中的以下代码: function render() { gl.clear(gl.COLOR_BUFFER_BIT); theta += 0.1; gl.uniform1f(thetaLoc, theta); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); render();

这是我关于StackOverflow的第一个问题,请原谅协议中的任何违规行为

我在大学的计算机图形学课上学习WebGL。在学习在屏幕上旋转正方形时,我和同学们注意到渲染函数中的以下代码:

function render() 
{ 
 gl.clear(gl.COLOR_BUFFER_BIT); 
 theta += 0.1; 
 gl.uniform1f(thetaLoc, theta); 
 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); 
 render(); 
}
我们不明白的是,我们的教授不能给我们一个充分的答案,为什么这段代码不会导致堆栈溢出,因为它递归地调用自己。我们运行了代码,它没有引起任何问题,但我们不明白为什么


我们无法在教科书或网上找到答案。如果有人能解释,我就把它传给我的同学。提前感谢。

这确实会导致堆栈溢出。当我运行它时,我得到

Uncaught RangeError: Maximum call stack size exceeded 
我想你可能看到过这样的代码

function render() {
   ...
   requestAnimationFrame(render);
}
render();

在这种情况下,它不是递归的。渲染函数正在请求动画帧,然后退出。然后浏览器再次渲染它调用的下一帧。

我从来没有听说过尾部调用优化,但您提供的链接对此进行了完美的解释。我会转告你的。谢谢最有可能的是,您的编译器足够聪明,能够识别优化的机会,但使用另一个编译器可能会溢出—请小心。另一方面,函数式语言严重依赖递归,其中一些语言提供了显式tailrec优化的方法,因此递归不是坏事,但可能很危险。感谢gman确认我没有发疯。但是JAre在评论中为我回答了这个问题,解释了尾部调用优化。很明显,您的浏览器没有这种优化,这导致了堆栈溢出。我感谢你和他帮助我理解这个问题。我认为只有ES6+有尾部呼叫优化。