30/09/2018, 17:03

[C++] Giúp sửa lỗi khi chạy đệ qui

Mình chạy chương trình như sau thì khi đến phần đệ qui thì nó bị lỗi. Không biết bị gì vì khi debug mới chạy vào là nó văng lỗi ra.

void Algorithm::Processing_QL(int i, vector<int> x, int n)
{
	for (int j = 0; j <= 1; j++)
	{
		x[i] = j;
		if (i == n)
		{
			KqTapHop.push_back(x);
			break;
		}
		else
			Processing_QL(i + 1, x, n);
	}
}

void Algorithm::SinhDayNhiPhanDoDaiN_QL()
{
	TaoDuLieuDauTien_QL();
	vector<int> x = KqTapHop[0];
	int n = DLDauVao.at(1);

	Processing_QL(0, x, n);
}

Nó cứ bào vector out of range mà khi mình debug vào hàm Processing_QL(0, x, n); thì nó đã báo lỗi rồi. Tìm hoài ko ra, mong chỉ giáo!

... viết 19:19 ngày 30/09/2018

Cho em thêm ít thông tin về vector KqTapHop với. Ban đầu nó được khai báo và khởi gán như thế nào?


Lỗi có thể do n được lấy từ dữ liệu đầu vào, nó lớn hơnsize của KqTapHop[0], nên việc truy cập phần tử vector x tại dòng x[i] = j là không đúng.
Hoa Hoa viết 19:05 ngày 30/09/2018
vector<vector<int>> KqTapHop;

KqTapHop là cái ma trận lưu lại kết quả của mỗi tập hợp. Ví dụ: {0, 1, 2}, {0, 2, 1},…mỗi tập hợp được lưu vào trong KqTapHop.

Hoa Hoa viết 19:19 ngày 30/09/2018

À đúng thật là do n rồi, phaỉ là if (i == n - 1) mới đúng. Vậy mà nãy giờ cữ tưởng bị gì, mò hoài ko ra.

... viết 19:17 ngày 30/09/2018

Nếu chỉ mới khởi tạo vector KqTapHop như thế thôi thì size của nó đang là 0. Nghĩa là chưa có vector nào trong đó cả. nên việc truy cập đến KqTapHop[0] là sai.
Kiểm chứng tại đây: http://ideone.com/JJbkIJ

Hoa Hoa viết 19:05 ngày 30/09/2018

À không! Cái này là 2 hàm mình chạy thôi. Còn mấy cái kia thì mình có hết rồi. Bài này mình giải theo thuật toán quay lùi nên chỉ khác ở 2 hàm này thôi, còn mấy cái dữ liệu input này nọ thì mình chạy được ở cách giải khác rồi.

Bài liên quan
0