Thuật toán để tránh đệ quy trong Ext Js 4

Đôi khi trong lập trình ta buộc phải dùng đệ quy để giải các bài toán về multilevel. Cứ gọi mãi 1 function cho tới khi đạt được mục đích thì thôi. Nhưng với những data lớn thì gọi đệ quy rất nguy hiểm vì sẽ gây ra stack overflow. Để giải quyết trường hợp trên, ta có thể xử lý như sau:

Ví dụ code của chúng ta là:

insertChildMultiLevel: function (rootNode, trees) {
	var node;
	Ext.each(trees, function (tree) {
		node = rootNode.appendChild(Ext.apply(Ext.clone(tree), {
			children: []
		}));
		if (Ext.isArray(tree.children)) {
			this.insertChildMultiLevel(node, tree.children);
		}
	}, this);
}


Ta có thể đổi thành function như sau, code chạy sẽ nhẹ hơn và tránh được stack overflow:

insertChildMultiLevel: function (rootNode, trees) {
	var node, i = 0;
	if (Ext.isArray(trees)) {
		for (i; i < trees.length; i++) {
			this.insertChildMultiLevel(rootNode, trees[i]);
		}
	} else {
		node = rootNode.appendChild(Ext.apply(Ext.clone(trees), {
			children: []
		}));
		if (Ext.isArray(trees.children)) {
			this.insertChildMultiLevel(node, trees.children);
		}
	}
}

Ở code ban đầu, ta chạy hàm foreach và gọi đệ quy, như thế cùng 1 lúc ta gọi hàm insertChildMultiLevel mỗi khi loop. Ở code thứ 2, ta chỉ xử lý khi dữ liệu đúng là nó, và hàm xử lý luôn chỉ chạy 1 lần, chứ không phải chạy nhiều lần trong vòng lặp for. (vì stack overflow chủ yếu gây ra là do ta gọi 1 hàm của chính nó mà xử lý bên trong foreach, for, while …)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s