Recursion 无限递归(当n接近无穷大时)是否总是导致堆栈溢出?

Recursion 无限递归(当n接近无穷大时)是否总是导致堆栈溢出?,recursion,Recursion,一个与递归有关的理论问题 对于任何递归问题,如果您的n变得非常大,它是否总是在n的某个值处分段错误?如果它是一个真正的递归,则是。对于递归,进程至少需要堆栈上的返回地址。这会占用堆栈空间,因此最终会导致堆栈溢出 如果您期望有如此大量的递归调用,那么最好将结果聚合起来 递归和是: Sum of all elements in a sequence = first element + sum of all elements in the sequence without the

一个与递归有关的理论问题


对于任何递归问题,如果您的n变得非常大,它是否总是在n的某个值处分段错误?如果它是一个真正的递归,则是。对于递归,进程至少需要堆栈上的返回地址。这会占用堆栈空间,因此最终会导致堆栈溢出

如果您期望有如此大量的递归调用,那么最好将结果聚合起来

递归和是:

Sum of all elements in a sequence = 
    first element + 
    sum of all elements in the sequence without the first one;
相反,使用一个没有递归的版本

sum = 0;
elementsLeft = complete sequence   
while still elements left
{
    sum = sum + first element of elementsLeft
    elementsLeft = elementsLeft without the first element
}

是的,如果它是一个真正的递归。对于递归,进程至少需要堆栈上的返回地址。这会占用堆栈空间,因此最终会导致堆栈溢出

如果您期望有如此大量的递归调用,那么最好将结果聚合起来

递归和是:

Sum of all elements in a sequence = 
    first element + 
    sum of all elements in the sequence without the first one;
相反,使用一个没有递归的版本

sum = 0;
elementsLeft = complete sequence   
while still elements left
{
    sum = sum + first element of elementsLeft
    elementsLeft = elementsLeft without the first element
}

它取决于编程语言和编译器。通常,每个函数调用都会添加到堆栈中。至少推送返回地址。由于堆栈空间是有限的,那么是的,它最终会出错。通常情况下,尾部调用优化例外:。太长,读不下去了编译器可以有效地将一些递归函数转换为while循环。这取决于编程语言和编译器。通常,每个函数调用都会添加到堆栈中。至少推送返回地址。由于堆栈空间是有限的,那么是的,它最终会出错。通常情况下,尾部调用优化例外:。太长,读不下去了编译器可以有效地将一些递归函数转换为while循环。那么尾部递归呢?请阅读这篇维基百科文章:关于尾部递归呢?请阅读这篇维基百科文章: