递归深度在算法中为什么这么大?

huangapple go评论71阅读模式
英文:

Why is the recursion depth in the algorithm so large?

问题

递归填充列表时,递归深度等于 (n^2 - n) / 2 而不是 n 的原因是因为每个元素都会触发一个新的递归调用,每个递归调用都会产生一个新的栈帧,导致递归深度呈二次增长。这是因为每个元素都会导致一个递归调用,而这个调用会继续调用下一个元素,以此类推,直到所有元素都添加到列表中。

因此,递归深度随着元素数量的增加呈二次增长,其数学表示为 (n^2 - n) / 2,而不是线性增长的 n。当元素数量超过3195时,递归深度超过了系统栈的限制,导致栈溢出错误。

英文:

Code for recursively filling in a unidirectional list:

#include <iostream>
#include <random>

using namespace std;

class Queue
{
private:
	class Node;

public:
	Queue()
	{
		size = 0;
		head = nullptr;
	}

	Node* push_back(int data, Node* next)
	{
		static int depth; // recursion depth

		if (next == nullptr)
		{
			next = new Node(data);
			if (size == 0)
				head = next;
			size++;
			return next;
		}
		
		depth++; // recursion depth

		next->pNext = push_back(data, next->pNext);
		return next;
	}
        Node* get_head() { return head; }
	int get_size() { return size; }

private:
	class Node
	{
	public:
		Node* pNext;
		int data;

		Node(int data = int(), Node* pNext = nullptr)
		{
			this->data = data;
			this->pNext = pNext;
		}
	};

	int size;
    Node* head;
};

Can you explain why the recursion depth when filling the list through a loop is equal to (n^2 - n) / 2, instead of n?

Because of this, a stack overflow occurs when the number of elements is greater than 3195.

答案1

得分: 0

这是因为在每次插入新值之前,没有将depth重置为零。

因此,当第二个值被推入链接列表时,depth首次从0增加到1。当第三个值插入链接列表时,depth再次从1增加到2,然后到3。以此类推。

您最终会计算出不仅是最后一个插入操作的递归深度,还包括所有插入操作的总和。

英文:

It's because nothing resets depth to zero, before each new value gets inserted.

So, when the 2nd value gets pushed into the linked list, depth gets incremented for the first time, from 0 to 1. When the 3rd value gets inserted into the linked list, depth then gets incremented from 1 to 2, then to 3. And so on.

You end up counting not just the recursion depth of the last insertion operation, but the sum total of all insertion operations.

huangapple
  • 本文由 发表于 2023年4月20日 06:03:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76059133.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定