Cần trợ giúp bài liệt kê hoán vị. Code bị lặp vô hạn và chỉ in 123

void xuly(int n){
	int mang[n];
	for (int i=1;i<=n;i++)
		mang[i]=i;
	do{
		int i=n-1;
		for (int z=1;z<=n;z++)
				printf("%d ",mang[z]);
		printf("\n");
		while(i>0 && mang[i]>mang[i+1]) i--;
		if (i>0){
			int k=n;
			while(mang[k]<mang[i]) k--;
			hoanvi(mang[k],mang[i]);
			int a=i+1,b=n;
			while(a<b){
				hoanvi(mang[a],mang[b]);
				a++;
				b--;
			}
		}
	}while(i!=0);
}

Mình làm bài liệt kê hoán vị nhưng code của mình khi cho chạy thì xuất kết quả lặp vô hạn nhưng chỉ in ra 123

Hàm hoán vị của bạn bị sai. :penguin:
2 giá trị truyền vào ko đc đổi giá trị.

Dùng con trỏ là xong ngay xD nhé

1 Like
void hoanvi(int x, int y){
	int z;
	z=x;
	x=y;
	y=z;
}

em chạy debug thì nó swap được nhưng không truyền vào hàm xuly được

Bạn dùng con trỏ là đc :slight_smile:

Vì hàm swap trên nó chỉ swap trong hàm thôi, khi ra khỏi làm là 2 giá trị truyền vào nguyên xi

void hoanvi(int *x, int *y){
	int z;
	z=*x;
	*x=*y;
	*y=z;
}
thêm dấu & trước khi truyền vào hàm
hoanvi(&m[a],&m[b]) là ngon ơ.
2 Likes

để em tìm hiểu về con trỏ :smile: trước giờ chưa dùng con trỏ bao giờ hết

1 Like

Bạn tìm hiểu thêm về cách truyền tham số vào hàm, vì nó có hai kiểu:

ps: Xin lỗi vì mình không biết diễn đạt như nào cho dễ hiểu, bạn tham khảo theo link trên

2 Likes

cảm ơn anh :large_orange_diamond:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?