PDA

View Full Version : Các thao tác trên mảng 1 chiều bằng đệ quy trong C



ducloi1
26-04-2009, 13:17
Nhập mảng ngẫu nhiên.
Xuất mảng.
Tính tổng các giá trị trong mảng
Tính trung bình cộng các giá trị chẳn trong mảng.
Đếm xem trong mảng có bao nhiêu phần tử lẻ.
Sắp xếp mảng tăng dần.
Chèn tăng một giá trị X vào mảng tăng dần.
Chèn giá trị X vào vị trí K trong mảng.
Xoá một phần tử tại vị trí K trong mảng.
Xoá các số âm trong mảng
Xoá các số trùng nhau trong mảng
Đảo ngược mảng.
Kiểm tra mảng có tăng dần hay không?
Kiểm tra mảng có đối xứng hay không?
Tìm xem có giá trị X trong mảng hay không?

Em đã làm được 3 ý đầu còn mấy ý sau em nghĩ mãi mà không ra (ngu quá mà)..Mấy anh giúp em với.

kimduquan
28-04-2009, 09:09
phương pháp đệ quy đó là thay vì chạy lần lượt từ đầu đến cuối thì bạn chỉ cần chạy bước cuối cùng sau khi chạy tất cả các bước trước nó,ví dụ như hàm nhập mảng ,nếu dùng đệ quy thì bạn sẽ trả lời câu hỏi:mình sẽ làm gì ở bước cuối cùng sau khi đã thực hiện n-1 bước,câu trả lời là sau khi nhập n-1 phần tử thì ta sẽ nhập phần tử cuối cùng,bây giờ ta sẽ viết như sau:
void input(int a[],int n)
{if(n>0){input(a,n-1)//nhập n-1 phần tử trước//;printf("enter the element:");scanf("%d",a[n-1]);//nhập phần tử cuối cùng//}
}//trường hợp suy biến là mảng ko có phần phần tử nào(n=0)//,các hàm khác cũng làm tương tự,để giải quyết đề bài=đệ quy bạn cứ trả lời câu hỏi:mình sẽ làm gì ở bước cuối cùng sau khi đã làm tất cả các bước trước nó ,việc thực hiện các bước trước nó =lời gọi đệ quy,nhớ thêm trường hợp suy biến vào là xong.

ducloi1
28-04-2009, 12:25
Hix! HÀm nhập, xuất và tính tổng các phần tử trong mảng tương tự nhau em đã làm được, nhưng mấy cái hàm kia thì có thêm điều kiện nữa (bó tay). Nếu dùng vòng lặp để giải thì em làm được nhưng làm đệ quy thi em thua.
Anh có thể hướng dẫn em với được không

kimduquan
28-04-2009, 12:37
ví dụ hàm sắp xếp :giải thuật bubber sort (sắp xếp hoán vị),giải thuật đệ quy :sau khi sắp xếp n-1 phần tử xét phần tử cuối cùng nếu < phần tử đứng trước nó thì hoán vị rồi sắp xếp lại n-1 phần tử trước đó ,trường hợp suy biến là mảng chỉ có 1 phần tử(ko cần sắp xếp nữa).Mã giả:
void sort(int a[],int n)
{if(n==1)return a[n-1];
else{sort(a,n-1);if(a[n-1]<a[n-2]){int temp=a[n-1];a[n-1]=a[n-2];a[n-2]=temp;sort(a,n-1);}
}các trường hợp khác tương tự.

ducloi1
29-04-2009, 08:32
Anh có thể giải thích thêm dc không ạ. em vẫn chưa hiểu lắm. nếu dc anh có thể viết luôn mã cho em tham khảo với.

kimduquan
29-04-2009, 09:10
ví dụ:đếm phần tử lẻ trong mảng.code:
int count(int a[],int n)
{if(n>0){int temp=count(a,n-1);
//đếm số phần tử lẻ có trong n-1 phần tử trước đó//;
if(a[n-1]%2==0)return temp;
//nếu phần tử cuối cùng là chẵn thì trả về số phần tử lẻ trong n-1 phần tử đầu tiên//
else return temp+1;
//nếu ko thì trả về số phần tử lẻ trong n phần tử//}.bạn về nghiên cứu 3 đaọn code mình post lên thì sẽ biết được quy luật của chúng rồi tự làm các bài còn lại.

ducloi1
29-04-2009, 10:43
Anh ơi cho em hỏi là trong câu Tính trung bình các số chẵn thì mình có dùng vòng lặp không.

minhquang12g
29-04-2009, 10:56
dùng đệ quy khác với dùng vòng lặp là bạn phải biết điều kiện dừng && điểm bắt đầu cho chương trình. :D

ducloi1
29-04-2009, 12:03
Vấn đề đó thì mình biết(đọc lý thuyết nhiều quá). Vẫn đề mình muốn hỏi là có cần vừa dùng vòng lặp vừa dùng đệ quy không(đệ quy phi tuyến).

kimduquan
01-05-2009, 09:48
bạn ko nên dùng đệ quy phi tuyến cho bài này,vì nếu đề bài yêu cầu là dùng đệ quy thì bạn rất dễ bị 0 điểm.

ducloi1
05-05-2009, 11:38
Thế demo giúp em với. Em nghĩ mãi mà chẳng ra.